?#TVsIg=Za~**=wyUrUeQv+?)w
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
D+s(-l
literal 0
HcmV?d00001
diff --git a/src/main/resources/assets/anvilcraft_guideme/textures/gui/sprites/background/ember.png b/src/main/resources/assets/anvilcraft_guideme/textures/gui/sprites/background/ember.png
new file mode 100644
index 0000000000000000000000000000000000000000..652665958e2dd3e72691d9131cd0bf57827541d0
GIT binary patch
literal 1047
zcmeAS@N?(olHy`uVBq!ia0vp^8-UoCgAGWs?S3~CNO2Z;L>4nJa0`PlBg3pY5)2H?
zCp}#pLn`LHy=#~);waJnaeozyk|X!V0AX&=m)k$j{$aUh%~2<9>((1B2@4q=16`V$
zG@>emkDonv?wqx?`F88`!MZA^c@Os|@4S8c`=llJm1bpXdsh8>Q1z*E`@49~e{cU@
zT>ts8fBrw&`#Z$#(oeNrd-m!2j4HiW?zh=G_fO84CwKqa;p@kD_AWy+=7vn1XXg6@?Z49x
z?&p1Y*Tp%znD?P-_3R_Jb4?O}=9+%=Qf6$P{%cilxD=zro-5bQ9!yngIOtuQ%N>`=
zU{JAgeeNM`RtBJoTV{KL_(583cZ9!UVAKD)b!~+z|A!0LS3Jnwo_kDtEy$Q#WqX32
zB%6HLc3b9y7jwhG+j+$YLE5+9eby5Gijn7D*=*^!mCO=*-kQ1ZnZ$l$|7^KExu)TJ
zE=d_w+|E5$vGklOOU3Q1cR-Uj{I53nptoQ3!PIL&bHcn2YM1IM9@zb7T1)sRhWuAM
zc^|C3e(8f(_JIenb>2s`Rqe!;)IVIyURkk}mys=h@3fxqTMP+6ftM9a4>cT&UN82+
ziA-`v;ioH>
zasu5SxAyT=Barq7e`iYqM@-|TxY
z45RfvOyk_M&8_!lQR8->2V2Eup>o$(=o^6yxb^$T=k_InKvx6V#T83i9NX(2oaNs0
zZCABH)`f-g6`z^b@7-tH!Dsb_IX@0)z^&$kFePo@6f9m`;NMf(cs(wMzlvS
z4coOfKbCoMvBy=1?Fl;cc8Un!o^L@P%hn5-nY}1j3ABapUU~X`RYnW#54UDBt!GIn
zez0|V^Y-2E8O&JXs)HX*WtbyV@z%FDd{WrE2QNPI+gk0Kym{Zz=ke7`zkF9WNUggP
zv1s;c*}cE^2>(Ccl2m=6_H6Us*u8&>VlREz7eDQQ^)j11pHJ>TpRfuf=lj3--i>|n
ilfK;EW3=ehU&fW9&e{vscP|9ybOujXKbLh*2~7Y%0uYA)
literal 0
HcmV?d00001
diff --git a/src/main/resources/assets/anvilcraft_guideme/textures/gui/sprites/background/heavy_iron_1.png b/src/main/resources/assets/anvilcraft_guideme/textures/gui/sprites/background/heavy_iron_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e65582d5d3fa129a9ba536f5273e711084fc1e4
GIT binary patch
literal 1000
zcmeAS@N?(olHy`uVBq!ia0vp^8-UoCgAGWs?S3~CNO2Z;L>4nJa0`PlBg3pY5)2H?
zvpiiKLn`LHy?fE`wt+<3L;e<*r9toVZ|Rj^I#TP*`BmQyM$-yKzc=>_=N@@q
zEfUzu_Bv2xtK$FGCFX**pee{w`_@7txVcXT9k6!8r9^`IUeLU4_y1;|n)k_~wwK?!l
zp84L_?QDB4aRRkv=~gT~r^-@s{r;>EUUCnL4>IKMz19|P#mM&lSG01R=Et1^mW|uv
zvX5%d1uB2NHEqu&Nrq;iz;SI+HlBM`TN}c)I3)Ib&0<|2!U0rpmFwQyZ+A~VX*d|Y
z{@MpGVP>}cy-^2m|J_z$bl}0-@YNMdJ3-oYA5T>Sy1r^_U-&5&Al>-g);QtAHSRt0
zXM&_3{N0}dR4!hz-|XfLUGa+3EcgDYNp611lt1%;v|ja@Y215Kncf#fCU1**petN)
z+_?W{QR8->2fe3F(oVD9Gio&7_rx$-@540CJ(;S#5IJA{Du}-IYga(!zPTOG*?AyZ
z?ZY$CudZxBTjHwMuYaFy&Lsgfe!XpbxR*r93-)_^4rH(2%@)|q_xHeT@rt)!*B*Sa
zz}f!8GuF83g{BfRP$l^pyiG7Ay=xuc!;~0ie@MNsP`=_b)B3#|O(kk~K$sDGf{wkN
zBEq-l+p%j2Umn&yILp1~8!*D!Zfk1FRJ>jK=x)wBRn>cbo(~UXpYICy+A(+1p~mZR
zTKC?C9=gdUyUz5(t68E5XM}F$<(F94`2Vs#er>_;d9%-MJegJBFJ$|G4xs{+%43A0y*H(Q?4G&ze82D8J2`i9
za(B`WS7#q*1VLOAcE%@z`V)9AJ95CgFp_;A6sKc5_vax9ZzX&fh^oOGK{$~K@p1dG
zhUu}ftkLbhmA0XEU$aL#v_|yk#Tijo)!St=H|nYz_M1~b=+lWUk>~_12uGNh;*4f8V563nyj!Z5?p0RGR0trh#*;>NI&Ivi9#?KJtvhN>N1+|8l>LIZnDAzIBAodiuJR{K
zQUvG(TZApP943v19gg%|$~2~Sr)&W%(_A)#m|=R8C4ffT*dqpg770xZIKHk6FtJHk)
z=e-r!fP*PF*XMeKgDJeMph&;mEM(U_@L?)cx+zW6e-4VYIPnJPxey&4Z5<0uhmkl7
z&FuNU=QvfvBk{VT72!{g`C=9(VZQ5sjUVO9HT|rc5^K1pEBLp|#OvvWuxb6%|K-_5
zqD{+kd9Qz(>#|(a&TW=Ivy)z@WT&u(+D9zHJnVlB?+CD4r;@d{$e=zh8p|ba*p5q7
zZX~`Qe1_#*cmTHa2`%CBqjDnX1;e-!@%6-(=5zwaeLjg7Jyaq&Y*gDtpHI3F$iVWb
z*^#w`1C>}dq!5ypB2TecjPPAaJcQ;mBHy4F)HekT3>c|zf%*=;;8!MN(mB-ZW@kYC
zrkg4VM4fc9vLR~*=}~G1&c0X>qUE64G*G2X#jZ^@2^hQh4x6Nr#UbQQnEDK(Vu)Bp
zCO4Jpr(_=Jm908zR^Uq9U6W2PD63_Yjv{PHVi0@|#tsj%D5Jp4YmGKZ4a8kBbtS}C
zlgXDLz7o9>2k>Tqdjov1T9yUzEQ25d;t>|555$LU5+%fWnEDjNJ;`J>z=uHk7Jz5F
z68m6!Tea*e#19w*DG&!!918J!HpvNyyJ6~bhJOdU2AV@+BU=8f}&0))OO|DeHW%-Dpe!!f%a?VtL&N!Id)rozull@
z1YAd)8q+4)m*H%1t^jPn6WlhON*n2l4@a-_nGRJVhZQehq2
zV1J^I36Sgz4-uySP%10c^GvEjF6g(kJiT5!rjx>-NV+wks)CSfCyHYpr%88fGzEni
zHac4n6CD=Y8}R&m(?D>7v8Si!=+qChF+2M)ZSl+C`2(q)U1P5&SC<#GFob^QnjhsI
eUU7fT#f~cW5|ahLp9g;|NW!+H_|`4y<^KY
zynWwEWXg#{isF-c3z=c`+Pt|sN<7%#uW#)UirY5ppBL!;(pI!&{oC)MY18Ngxk+8~
z!u)1lzMW8(>mVzi-D$6X5!PLfS(+l7rUqnN6Aca&n%iL+F~>B$O#=06I>CGU9BwJhvb6jgLo!4JH$
zXa#BVUpu*yIE?sE*Q9mjMY;KhZ2%SQLYkL$Xq>ok11|El2c+De7;er(O56eQc)7t;
zWs3y|0Yl|4c;6}kDqjQeFBhxz)k~-*9H`3ktuf>rsl8+c#13Ooti&kw;{^^(-Dx-|
zAk7;ZM71BYz$+@Gr@lfNA_0Qup4Wi=;TQKq!gxF9`e}YnPK4B7)=A1fa&Q#b;86izWtW}r=
z?`sjDZ`Odp>;8nsjzYs;YLcO6vki(R8>Mzi5nh5L0mSe?0rE@^*zf@I>>Dp>%mq%
zGD_W9sgOhxLs%+qDGM8of;O@>YD>mG*dk;K$=$1ixwJU>9Z+Fk8%#XQ_t9_(x2g4x
z)cXf;jbR^RqB7)jPFUX7Ju1A&ALVFFoH@1r?JX{i>080`wmdA3W?m2QAvE?BYCw=C
zM{Bk6XS~m5B$US2*uv3=Ew6xz9lWvs|3STBbTEAg_No7r7*;EP4~GYdDbio9vC7V|
zwoIg3ZQVXut*oM{io}7e6c0y8)r*FE@L+G!jANVsYE{ca>3YjV%(G0=L;cwP#heme6~nBNn47Xl#(`@>B&mKJ8}fDa=O
z@D6z>g8=zzv#EBj8OUs%@!s
zR}|1z2JPVPL7i}y7ocY>Uj)|%)~{-ZJB=Fps+aQsEHfn>vjWi2@XUIkg7Ya_%*@l=
zGQd28{>fr+b2H&4LR`VeyUUB_!P7RZ7B7jSWN8egq5HYyGd5a(N8-vw_a*PS=&s~3
z7d1*Qv6266$zd*PmSk|*J%y*3?hZbZO??3O%8U!AHb|V=?41x9+gs4K{gPrwCR-6g
zYWKpEgc=S$N~C03j%b6Pxyjf{Jz|H&J!PHT-GiK6&zN!R)QMKkV*PCEP@?D$H(qib
z%%EiLT&2MB;o7u0tm>*xGy%RWwCP-fW*pmEMJ*wn&-D>zl+I@sSXfaDL--ED-Yc9)
ztru%3b{f^BW9K;SgUWBQbHq7Wnw#%E{Tp6iaLe49RmigxHY~1JqWKp&VhJI2XHCYY
zliFn*W(g(B=P)x+c_(Y~tUGr3TaI=BnZ;Gvk-n+y;FUZiaW3mA@up~|8|@J9FK_
zRgB$7YIm~KC(}{+I6neWZ35v_wQrvqt50KqaJN_vRr>;TeMrc%j*{
zNe`wQSQ%L_`T}kM#GWR#h46|eD_q=}YuZM6@4^sowXrm+j
O&mJ8a6LEe~O5T6HEA}n`
literal 0
HcmV?d00001
diff --git a/src/main/resources/assets/anvilcraft_guideme/textures/gui/sprites/background/royal.png b/src/main/resources/assets/anvilcraft_guideme/textures/gui/sprites/background/royal.png
new file mode 100644
index 0000000000000000000000000000000000000000..2332535229e920402b6a13cd2e5b710a779438aa
GIT binary patch
literal 1014
zcmeAS@N?(olHy`uVBq!ia0vp^8-UoCgAGWs?S3~CNO2Z;L>4nJa0`PlBg3pY5)2H?
zD?D8sLn`LHy?fv9ii1SkM{#DQl#erRo5VGlC+%Taf874LQ%|R(fGhuphPkC0bIYF1
zKIeD4a^7OK*~`v;IKAxVv^w@l?_9TB;8T5hb@ug>*7N4iXR+VC=g-#L{|f)6Z~y!0
zP35OT9p1UKPum~AQmYx05qtd8+#_H9eu{d3fA3Y}(+3ZD*S-~gf1N*GC3k;gxq89J
z;*#f=&jx;I*lu25e!JX!fBEg>v&H-Ew69*+xzp*n;AZ{S&Hrj^)i+x1nRIDiqrbWP
z!Sih&-Ys5OT+I7Wwfgsw+qzN)6)V@zs#xlA;K9;;S&yeGF*HyAHH$eelLaKP^TAX$
zuz+x!CWFMDE7$LQ@Um?<=v{kOaQziVp14=p>nc?FKU~NS`LONwoR417AXA?8g-iXE
zuHtt{qbytggND()onoB#F_71!@eeE^x9yL#(`saDek9>msXAJVRD`2O`C
z+lOn}xfM%w6F#ilZ~ADe(0%TS!WFN#hV8jD4`@$Z_A%|Zj0Qk~vOPhG2Og{q=dM`V
z)Nn9*eb@)DR*-_V4{Yzv@zMf%?Q0hAdK1Hh57$=9?&*Io=FbKa5?ya12og%&bBP6{
z?b=7LnLt|qgIx+6&%LU~@AYaxQ^hOfr}F@nGrhm8CcXJ7Q~t~Yx9_VYZ;N@LD_n6n
zwf|;O<9441vU=HPrg85{WqM!n%rIK-!!*u4g)@)k>^u;y_Tkuco3zuc_lz3N*Dis|
zy>x}@+bU`bk-L8H#SC5XiqkCj_AJUvX#g6zwYB@Ew|*(f-j_q|1&T{Yh=9Fz<0abGEf)oooREczS^F5f7q-zgOE^xO0
z@QgLCIyu|mR}qA{v0`b@aZOE`inqOwWh-~eSA1q#zc*yhq=$uGTHJf0yP=-S{1QyFsj_IxY)
zPUdR(|xlwD9(iFF(D+<@Z0GbN|)n^?N6M`}~hJjq~UBtmRob
zyt|Iu*jZnkdb>Q~?tIS&y_|c#=~R^e?pyP_aY^;(nS!D3>ilc~
literal 0
HcmV?d00001
diff --git a/src/main/resources/assets/anvilcraft_guideme/textures/gui/sprites/background/shulker.png b/src/main/resources/assets/anvilcraft_guideme/textures/gui/sprites/background/shulker.png
new file mode 100644
index 0000000000000000000000000000000000000000..01da9fad12c15859f56b3b7843cbda3923384db7
GIT binary patch
literal 885
zcmeAS@N?(olHy`uVBq!ia0vp^SwMV`gAGVtt(y7;NO2Z;L>4nJa0`PlBg3pY5)2H?
z>Ygr+Ar*7pUO(s+!YFd=V{%MJu)&36OV3|D-JyRud1?T+`N0{2SKP!+U#b=g&3abT
zem_6Bn7{GE`%^XQp{3DVwugky-EX^o)vC+am#=<&_3YJGn|~L+6MwJw%2hCNHh31U+W)S`F%LQ_1+2rr&a;2BbTkS&c6@&xAyJ#x99EaYhQ0(%)}|`v_jzgtw5P+
zvZf6IiY;7;?xsoZyb2*43!QER_TC6&<^ZWE3sEk+!T>U)MfPgPsM6sb0w34NZv8#)
zecg@SvZ6VaZyv6Dao?`o{?A=$(WI@5<^K8A{HQtpx1u~hq+{u-SC791hla-1?~aq*
z|7S;JZJGT&kh+ztetr1&>4ZJo?~27vb3(4Z-B{1@Z8x)))gsdkX*Ef}e8k}C>gTe~
HDWM4f0P0)y
literal 0
HcmV?d00001
diff --git a/src/main/resources/assets/anvilcraft_guideme/textures/gui/sprites/background/stone.png b/src/main/resources/assets/anvilcraft_guideme/textures/gui/sprites/background/stone.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b85f171edea3eb792230a2e468d5753c5aff504
GIT binary patch
literal 3102
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
E02y)jGynhq
literal 0
HcmV?d00001
From 5f579f011e126b29762d6a449da3b6c322e71209 Mon Sep 17 00:00:00 2001
From: theabab2333 <2047477146@qq.com>
Date: Tue, 9 Dec 2025 12:05:06 +0800
Subject: [PATCH 04/27] =?UTF-8?q?feat(guide):=20=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E6=A6=82=E7=8E=87=E7=89=A9=E5=93=81=E6=8F=90=E7=A4=BA=E4=B8=8E?=
=?UTF-8?q?=E9=85=8D=E6=96=B9=E5=B8=83=E5=B1=80=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
新增 ChanceItemTooltip 类用于显示带概率的物品提示信息,
支持多种随机数生成器(如二项分布、均匀分布等)的期望值计算和范围展示。
重构多个配方类,移除对 BetterLytVBox 的依赖,直接继承 LytVBox,并更新相关渲染逻辑以适配新的布局结构。
迁移 LytBlockSlot 至 slot 包下,并重命名为更通用的输入/输出槽位组件,
提升代码组织性和可维护性
---
guidebook/index.md | 6 +-
.../guideme/lyt/LytRecipeBlock.java | 74 ----------
.../recipe/RecipeTypeContributions.java | 19 +++
.../LytBaseMultipleToOneSmithingRecipe.java | 19 ---
.../recipe/anvil/LytBlockCompressRecipe.java | 6 +-
.../recipe/anvil/LytBlockCrushRecipe.java | 12 +-
.../recipe/anvil/LytBlockSmearRecipe.java | 6 +-
.../recipe/anvil/LytBoilingRecipe.java | 68 ++++-----
.../recipe/anvil/LytBulgingRecipe.java | 94 ------------
.../recipe/anvil/LytCementStainingRecipe.java | 43 ------
.../anvil/LytColoredConcreteRecipe.java | 38 -----
.../recipe/anvil/LytItemCompressRecipe.java | 38 -----
.../recipe/anvil/LytItemCrushRecipe.java | 39 -----
.../recipe/anvil/LytItemInjectRecipe.java | 29 ----
.../recipe/anvil/LytMassInjectRecipe.java | 32 ----
.../guideme/recipe/anvil/LytMeshRecipe.java | 40 -----
.../anvil/LytNeutronIrradiationRecipe.java | 59 --------
.../recipe/anvil/LytSqueezingRecipe.java | 64 --------
.../recipe/anvil/LytStampingRecipe.java | 7 -
.../recipe/anvil/LytVoidDecayRecipe.java | 48 ------
.../guideme/recipe/box/BetterLytVBox.java | 16 --
.../recipe/{box => slot}/LytBlockSlot.java | 3 +-
.../guideme/recipe/slot/LytInputItemSlot.java | 138 ++++++++++++++++++
.../recipe/slot/LytOutputItemSlot.java | 128 ++++++++++++++++
.../recipe/tooltip/ChanceItemTooltip.java | 105 +++++++++++++
25 files changed, 439 insertions(+), 692 deletions(-)
delete mode 100644 src/main/java/dev/anvilcraft/guideme/lyt/LytRecipeBlock.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBaseMultipleToOneSmithingRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBulgingRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytCementStainingRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytColoredConcreteRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCompressRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCrushRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemInjectRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMassInjectRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMeshRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytNeutronIrradiationRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytSqueezingRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytStampingRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytVoidDecayRecipe.java
delete mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/box/BetterLytVBox.java
rename src/main/java/dev/anvilcraft/guideme/recipe/{box => slot}/LytBlockSlot.java (96%)
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/slot/LytInputItemSlot.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/slot/LytOutputItemSlot.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/tooltip/ChanceItemTooltip.java
diff --git a/guidebook/index.md b/guidebook/index.md
index d70b070..ed22e8d 100644
--- a/guidebook/index.md
+++ b/guidebook/index.md
@@ -9,7 +9,7 @@ navigation:
# 介绍
-## 欢迎来到模组《铁砧工艺》的页面!模组是以铁砧为核心的原版生存拓展,主要内容有:anvilcraft:block_crush/andesite
+## 欢迎来到模组《铁砧工艺》的页面!模组是以铁砧为核心的原版生存拓展
* 磁铁:将铁砧吸到空中,红石充能后释放
* 粉碎:将岩石粉碎为粉末
@@ -22,4 +22,6 @@ navigation:
* 压合:将两个方块压成一个
* 方块破坏:破坏切石机上的方块
-
\ No newline at end of file
+
+// beef_mushroom_stew
+// slime_ball
\ No newline at end of file
diff --git a/src/main/java/dev/anvilcraft/guideme/lyt/LytRecipeBlock.java b/src/main/java/dev/anvilcraft/guideme/lyt/LytRecipeBlock.java
deleted file mode 100644
index fcc7ea8..0000000
--- a/src/main/java/dev/anvilcraft/guideme/lyt/LytRecipeBlock.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package dev.anvilcraft.guideme.lyt;
-
-import dev.anvilcraft.lib.recipe.component.BlockStatePredicate;
-import dev.anvilcraft.lib.recipe.component.ChanceBlockState;
-import guideme.document.LytRect;
-import guideme.document.block.LytBlock;
-import guideme.layout.LayoutContext;
-import guideme.render.RenderContext;
-import lombok.Getter;
-import lombok.Setter;
-import net.minecraft.client.renderer.MultiBufferSource;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-// WIP or RIP
-public class LytRecipeBlock extends LytBlock {
-
- private static final int BLOCK_SIZE = 16;
- private static final int COMMON_HEIGHT = BLOCK_SIZE * 3;
- private static final int LAGER_HEIGHT = BLOCK_SIZE * 4;
- private static int CYCLE_TIME = Math.toIntExact(System.nanoTime() / TimeUnit.MILLISECONDS.toNanos(2000));
- public static final int WIDTH = 162;
-
- @Setter
- @Getter
- private int workingBlockCount = 2;
-
- private List blockStatePredicates;
- private List chanceBlockStates;
-
- // 没填的了填null也可以的
- public LytRecipeBlock(
- List blockStatePredicateList,
- List chanceBlockStateList,
- boolean anvil
- ) {
- if (blockStatePredicateList != null) this.blockStatePredicates = blockStatePredicateList;
- if (chanceBlockStateList != null) this.chanceBlockStates = chanceBlockStateList;
- }
-
- @Override
- protected LytRect computeLayout(LayoutContext context, int x, int y, int availableWidth) {
- if (workingBlockCount > 2) {
- return new LytRect(x, y, WIDTH, COMMON_HEIGHT);
- } else {
- return new LytRect(x, y, WIDTH, LAGER_HEIGHT);
- }
- }
-
- @Override
- public void render(RenderContext context) {
- int x = bounds.x();
- int y = bounds.y();
-
- if (!blockStatePredicates.isEmpty()) {
-
- }
-
- if (!chanceBlockStates.isEmpty()) {
-
- }
- }
-
- @Override
- protected void onLayoutMoved(int deltaX, int deltaY) {
- // 似乎没用()
- }
-
- @Override
- public void renderBatch(RenderContext context, MultiBufferSource buffers) {
- // 似乎没用()
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/RecipeTypeContributions.java b/src/main/java/dev/anvilcraft/guideme/recipe/RecipeTypeContributions.java
index 75e9889..2f8852d 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/RecipeTypeContributions.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/RecipeTypeContributions.java
@@ -3,10 +3,12 @@
import dev.anvilcraft.guideme.recipe.anvil.LytBlockCompressRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytBlockCrushRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytBlockSmearRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytBoilingRecipe;
import dev.dubhe.anvilcraft.init.reicpe.ModRecipeTypes;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockCompressRecipe;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockCrushRecipe;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockSmearRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.BoilingRecipe;
import guideme.compiler.tags.RecipeTypeMappingSupplier;
import guideme.document.block.recipes.LytStandardRecipeBox;
import net.minecraft.world.item.Items;
@@ -18,6 +20,7 @@ public void collect(RecipeTypeMappings mappings) {
mappings.add(ModRecipeTypes.BLOCK_COMPRESS_TYPE.get(), RecipeTypeContributions::blockCompress);
mappings.add(ModRecipeTypes.BLOCK_CRUSH_TYPE.get(), RecipeTypeContributions::blockCrush);
mappings.add(ModRecipeTypes.BLOCK_SMEAR_TYPE.get(), RecipeTypeContributions::blockSmear);
+ mappings.add(ModRecipeTypes.BOILING_TYPE.get(), RecipeTypeContributions::boiling);
}
private static LytStandardRecipeBox blockCompress(RecipeHolder holder) {
@@ -71,4 +74,20 @@ private static LytStandardRecipeBox blockSmear(RecipeHolder boiling(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytBoilingRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getResultItems()
+ .getFirst()
+ .getItem()
+ .getDescription()
+ .getString()
+ )
+ .build(holder);
+ }
}
\ No newline at end of file
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBaseMultipleToOneSmithingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBaseMultipleToOneSmithingRecipe.java
deleted file mode 100644
index 4812b86..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBaseMultipleToOneSmithingRecipe.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.dubhe.anvilcraft.recipe.multiple.BaseMultipleToOneSmithingRecipe;
-import guideme.render.RenderContext;
-import net.minecraft.client.gui.GuiGraphics;
-
-public class LytBaseMultipleToOneSmithingRecipe extends BetterLytVBox {
- private final BaseMultipleToOneSmithingRecipe recipe;
-
- public LytBaseMultipleToOneSmithingRecipe(BaseMultipleToOneSmithingRecipe recipe) {
- this.recipe = recipe;
- }
-
- @Override
- public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCompressRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCompressRecipe.java
index d2899a2..c18fdfc 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCompressRecipe.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCompressRecipe.java
@@ -1,15 +1,15 @@
package dev.anvilcraft.guideme.recipe.anvil;
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.anvilcraft.guideme.recipe.box.LytBlockSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytBlockSlot;
import dev.anvilcraft.guideme.util.BlockStateUtil;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockCompressRecipe;
import guideme.document.LytRect;
import guideme.document.block.LytSlot;
+import guideme.document.block.LytVBox;
import guideme.layout.LayoutContext;
import guideme.render.RenderContext;
-public class LytBlockCompressRecipe extends BetterLytVBox {
+public class LytBlockCompressRecipe extends LytVBox {
private final LytBlockSlot inputBlocks;
private final LytBlockSlot outputBlocks;
private final LytSlot inputFirstSlot;
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCrushRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCrushRecipe.java
index 8de2c47..d23085a 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCrushRecipe.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCrushRecipe.java
@@ -1,21 +1,15 @@
package dev.anvilcraft.guideme.recipe.anvil;
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.anvilcraft.guideme.recipe.box.LytBlockSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytBlockSlot;
import dev.anvilcraft.guideme.util.BlockStateUtil;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockCrushRecipe;
import guideme.document.LytRect;
import guideme.document.block.LytSlot;
+import guideme.document.block.LytVBox;
import guideme.layout.LayoutContext;
import guideme.render.RenderContext;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.world.level.block.Blocks;
-import net.minecraft.world.level.block.state.BlockState;
-import java.util.List;
-
-public class LytBlockCrushRecipe extends BetterLytVBox {
+public class LytBlockCrushRecipe extends LytVBox {
private final LytBlockSlot inputBlocks;
private final LytBlockSlot outputBlocks;
private final LytSlot inputSlot;
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockSmearRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockSmearRecipe.java
index 76d7e6f..4cf405c 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockSmearRecipe.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockSmearRecipe.java
@@ -1,15 +1,15 @@
package dev.anvilcraft.guideme.recipe.anvil;
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.anvilcraft.guideme.recipe.box.LytBlockSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytBlockSlot;
import dev.anvilcraft.guideme.util.BlockStateUtil;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockSmearRecipe;
import guideme.document.LytRect;
import guideme.document.block.LytSlot;
+import guideme.document.block.LytVBox;
import guideme.layout.LayoutContext;
import guideme.render.RenderContext;
-public class LytBlockSmearRecipe extends BetterLytVBox {
+public class LytBlockSmearRecipe extends LytVBox {
private final LytBlockSlot inputBlocks;
private final LytBlockSlot outputBlocks;
private final LytSlot inputFirstSlot;
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBoilingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBoilingRecipe.java
index b720b42..888ec5c 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBoilingRecipe.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBoilingRecipe.java
@@ -1,48 +1,50 @@
package dev.anvilcraft.guideme.recipe.anvil;
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
+import dev.anvilcraft.guideme.recipe.slot.LytBlockSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytInputItemSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytOutputItemSlot;
+import dev.anvilcraft.lib.recipe.component.BlockStatePredicate;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BoilingRecipe;
-import dev.dubhe.anvilcraft.util.CauldronUtil;
+import guideme.document.LytRect;
+import guideme.document.block.LytVBox;
+import guideme.layout.LayoutContext;
import guideme.render.RenderContext;
-import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.CampfireBlock;
+import net.minecraft.world.level.block.LayeredCauldronBlock;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LytBoilingRecipe extends LytVBox {
+ private final LytBlockSlot workBlocks;
+ private final LytInputItemSlot inputItemSlot;
+ private final LytOutputItemSlot outputItemSlot;
-public class LytBoilingRecipe extends BetterLytVBox {
- private final BoilingRecipe recipe;
public LytBoilingRecipe(BoilingRecipe recipe) {
- this.recipe = recipe;
+ List work = new ArrayList<>();
+ work.add(BlockStatePredicate.builder().of(Blocks.WATER_CAULDRON).with(LayeredCauldronBlock.LEVEL, 3).build());
+ work.add(BlockStatePredicate.builder().of(Blocks.CAMPFIRE).with(CampfireBlock.LIT, true).build());
+ append(workBlocks = new LytBlockSlot(work));
+ workBlocks.setAnvilAnimation(true);
+
+ append(inputItemSlot = new LytInputItemSlot(recipe.getInputItems()));
+ append(outputItemSlot = new LytOutputItemSlot(recipe.getResultItems()));
}
@Override
public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
-
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.ANVIL.defaultBlockState(),
- getSafeX(),
- getSafeY() + ANVIL_ANIMATION,
- 20,
- 12,
- RenderSupport.SINGLE_BLOCK);
- RenderSupport.renderBlock(
- guiGraphics,
- CauldronUtil.fullState(Blocks.WATER_CAULDRON),
- getSafeX(),
- getSafeY(),
- 10,
- 12,
- RenderSupport.SINGLE_BLOCK);
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.CAMPFIRE.defaultBlockState().setValue(CampfireBlock.LIT, true),
- getSafeX(),
- getSafeY(),
- 0,
- 12,
- RenderSupport.SINGLE_BLOCK);
+ workBlocks.render(context);
+ inputItemSlot.render(context);
+ outputItemSlot.render(context);
+ }
+
+ @Override
+ protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
+ workBlocks.layout(context, x + 50, y, availableWidth);
+ inputItemSlot.layout(context, x, y, availableWidth);
+ outputItemSlot.layout(context, x + 68, y, availableWidth);
+ return new LytRect(x, y, 120, 48);
}
}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBulgingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBulgingRecipe.java
deleted file mode 100644
index a82ce07..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBulgingRecipe.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import com.mojang.blaze3d.vertex.PoseStack;
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
-import dev.dubhe.anvilcraft.recipe.anvil.wrap.BulgingRecipe;
-import dev.dubhe.anvilcraft.recipe.component.HasCauldronSimple;
-import dev.dubhe.anvilcraft.util.CauldronUtil;
-import guideme.render.RenderContext;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.network.chat.Component;
-import net.minecraft.world.level.block.Block;
-import net.minecraft.world.level.block.Blocks;
-import net.minecraft.world.level.block.state.BlockState;
-
-public class LytBulgingRecipe extends BetterLytVBox {
- private final BulgingRecipe recipe;
-
- public LytBulgingRecipe(BulgingRecipe recipe) {
- this.recipe = recipe;
- }
-
- @Override
- public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.ANVIL.defaultBlockState(),
- 81,
- 22 + ANVIL_ANIMATION,
- 20,
- 12,
- RenderSupport.SINGLE_BLOCK);
- BlockState state;
- if (recipe.isFromWater()) {
- state = CauldronUtil.fullState(Blocks.WATER_CAULDRON);
- } else if (recipe.isProduceFluid()) {
- state = Blocks.CAULDRON.defaultBlockState();
- } else {
- state = recipe.getHasCauldron().getTransformCauldron().defaultBlockState();
- }
- RenderSupport.renderBlock(guiGraphics, state, 81, 40, 10, 12, RenderSupport.SINGLE_BLOCK);
-
- if (!recipe.getResultItems().isEmpty()) {
- HasCauldronSimple hasCauldron = recipe.getHasCauldron();
- if (recipe.isConsumeFluid()) {
- PoseStack pose = guiGraphics.pose();
- pose.pushPose();
- pose.scale(0.8f, 0.8f, 1.0f);
- guiGraphics.drawString(
- Minecraft.getInstance().font,
- Component.translatable(
- "gui.anvilcraft.category.bulging.consume_fluid",
- hasCauldron.consume(),
- hasCauldron.getFluidCauldron().getName()
- ),
- 0,
- 70,
- 0xFF000000,
- false
- );
- pose.popPose();
- } else if (recipe.isProduceFluid()) {
- PoseStack pose = guiGraphics.pose();
- pose.pushPose();
- pose.scale(0.8f, 0.8f, 1.0f);
- guiGraphics.drawString(
- Minecraft.getInstance().font,
- Component.translatable(
- "gui.anvilcraft.category.bulging.produce_fluid",
- -hasCauldron.consume(),
- hasCauldron.getTransformCauldron().getName()
- ),
- 0,
- 70,
- 0xFF000000,
- false
- );
- pose.popPose();
- }
- } else {
- Block result = recipe.getHasCauldron().getTransformCauldron();
- if (recipe.isConsumeFluid()) {
- state = CauldronUtil.getStateFromContentAndLevel(result, CauldronUtil.maxLevel(result) - 1);
- } else if (recipe.isProduceFluid()) {
- state = CauldronUtil.getStateFromContentAndLevel(result, 1);
- } else {
- state = CauldronUtil.fullState(result);
- }
- RenderSupport.renderBlock(guiGraphics, state, 133, 30, 0, 12, RenderSupport.SINGLE_BLOCK);
- }
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytCementStainingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytCementStainingRecipe.java
deleted file mode 100644
index 740d763..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytCementStainingRecipe.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.dubhe.anvilcraft.block.state.Color;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
-import dev.dubhe.anvilcraft.init.block.ModBlocks;
-import dev.dubhe.anvilcraft.integration.jei.recipe.CementStainingRecipe;
-import guideme.render.RenderContext;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.world.level.block.Blocks;
-
-public class LytCementStainingRecipe extends BetterLytVBox {
- private final CementStainingRecipe recipe;
-
-
- public LytCementStainingRecipe(CementStainingRecipe recipe) {
- this.recipe = recipe;
- }
-
- @Override
- public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
- Color color = recipe.resultBlock().getColor();
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.ANVIL.defaultBlockState(),
- 81,
- 22 + ANVIL_ANIMATION,
- 20,
- 12,
- RenderSupport.SINGLE_BLOCK);
- RenderSupport.renderBlock(
- guiGraphics,
- ModBlocks.CEMENT_CAULDRONS.get(color).getDefaultState(),
- 81,
- 40,
- 10,
- 12,
- RenderSupport.SINGLE_BLOCK);
-
- RenderSupport.renderBlock(guiGraphics, recipe.resultBlock().defaultBlockState(), 133, 30, 0, 12, RenderSupport.SINGLE_BLOCK);
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytColoredConcreteRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytColoredConcreteRecipe.java
deleted file mode 100644
index 02c7861..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytColoredConcreteRecipe.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
-import dev.dubhe.anvilcraft.init.block.ModBlocks;
-import dev.dubhe.anvilcraft.integration.jei.recipe.ColoredConcreteRecipe;
-import guideme.render.RenderContext;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.world.level.block.Blocks;
-
-public class LytColoredConcreteRecipe extends BetterLytVBox {
- private final ColoredConcreteRecipe recipe;
-
- public LytColoredConcreteRecipe(ColoredConcreteRecipe recipe) {
- this.recipe = recipe;
- }
-
- @Override
- public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.ANVIL.defaultBlockState(),
- 81,
- 22 + ANVIL_ANIMATION,
- 20,
- 12,
- RenderSupport.SINGLE_BLOCK);
- RenderSupport.renderBlock(
- guiGraphics,
- ModBlocks.CEMENT_CAULDRONS.get(recipe.color()).getDefaultState(),
- 81,
- 40,
- 10,
- 12,
- RenderSupport.SINGLE_BLOCK);
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCompressRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCompressRecipe.java
deleted file mode 100644
index 8e9a7aa..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCompressRecipe.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
-import dev.dubhe.anvilcraft.init.block.ModBlocks;
-import dev.dubhe.anvilcraft.recipe.anvil.wrap.ItemCompressRecipe;
-import guideme.render.RenderContext;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.world.level.block.Blocks;
-
-public class LytItemCompressRecipe extends BetterLytVBox {
- private final ItemCompressRecipe recipe;
-
- public LytItemCompressRecipe(ItemCompressRecipe recipe) {
- this.recipe = recipe;
- }
-
- @Override
- public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.ANVIL.defaultBlockState(),
- 81,
- 22 + ANVIL_ANIMATION,
- 20,
- 12,
- RenderSupport.SINGLE_BLOCK);
- RenderSupport.renderBlock(
- guiGraphics,
- ModBlocks.CRUSHING_TABLE.getDefaultState(),
- 81,
- 40,
- 10,
- 12,
- RenderSupport.SINGLE_BLOCK);
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCrushRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCrushRecipe.java
deleted file mode 100644
index 3d213cf..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCrushRecipe.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
-import dev.dubhe.anvilcraft.init.block.ModBlocks;
-import dev.dubhe.anvilcraft.recipe.anvil.wrap.ItemCrushRecipe;
-import guideme.render.RenderContext;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.world.level.block.Blocks;
-
-public class LytItemCrushRecipe extends BetterLytVBox {
- private final ItemCrushRecipe recipe;
-
- public LytItemCrushRecipe(ItemCrushRecipe recipe) {
- this.recipe = recipe;
- }
- @Override
- public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.ANVIL.defaultBlockState(),
- 81,
- 22 + ANVIL_ANIMATION,
- 20,
- 12,
- RenderSupport.SINGLE_BLOCK
- );
- RenderSupport.renderBlock(
- guiGraphics,
- ModBlocks.CRUSHING_TABLE.getDefaultState(),
- 81,
- 40,
- 10,
- 12,
- RenderSupport.SINGLE_BLOCK
- );
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemInjectRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemInjectRecipe.java
deleted file mode 100644
index 71fc566..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemInjectRecipe.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
-import dev.dubhe.anvilcraft.recipe.anvil.wrap.ItemInjectRecipe;
-import guideme.render.RenderContext;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.world.level.block.Blocks;
-
-public class LytItemInjectRecipe extends BetterLytVBox {
- private final ItemInjectRecipe recipe;
-
- public LytItemInjectRecipe(ItemInjectRecipe recipe) {
- this.recipe = recipe;
- }
-
- @Override
- public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.ANVIL.defaultBlockState(),
- 81,
- 22 + ANVIL_ANIMATION,
- 20,
- 12,
- RenderSupport.SINGLE_BLOCK);
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMassInjectRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMassInjectRecipe.java
deleted file mode 100644
index 8a4b2f2..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMassInjectRecipe.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
-import dev.dubhe.anvilcraft.init.block.ModBlocks;
-import dev.dubhe.anvilcraft.recipe.anvil.MassInjectRecipe;
-import guideme.render.RenderContext;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.world.level.block.Blocks;
-
-public class LytMassInjectRecipe extends BetterLytVBox {
- private final MassInjectRecipe recipe;
-
- public LytMassInjectRecipe(MassInjectRecipe recipe) {
- this.recipe = recipe;
- }
-
- @Override
- public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.ANVIL.defaultBlockState(),
- 81,
- 22 + ANVIL_ANIMATION,
- 20,
- 12,
- RenderSupport.SINGLE_BLOCK);
- RenderSupport.renderBlock(guiGraphics, ModBlocks.SPACE_OVERCOMPRESSOR.getDefaultState(),
- 81, 40, 10, 12, RenderSupport.SINGLE_BLOCK);
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMeshRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMeshRecipe.java
deleted file mode 100644
index e5bcb87..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMeshRecipe.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
-import dev.dubhe.anvilcraft.recipe.anvil.wrap.MeshRecipe;
-import guideme.render.RenderContext;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.world.level.block.Blocks;
-
-public class LytMeshRecipe extends BetterLytVBox {
- private final MeshRecipe recipe;
-
- public LytMeshRecipe(MeshRecipe recipe) {
- this.recipe = recipe;
- }
-
- @Override
- public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.ANVIL.defaultBlockState(),
- 81,
- 12 + ANVIL_ANIMATION,
- 20,
- 12,
- RenderSupport.SINGLE_BLOCK
- );
-
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.SCAFFOLDING.defaultBlockState(),
- 81,
- 30,
- 10,
- 12,
- RenderSupport.SINGLE_BLOCK
- );
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytNeutronIrradiationRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytNeutronIrradiationRecipe.java
deleted file mode 100644
index af72716..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytNeutronIrradiationRecipe.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
-import dev.dubhe.anvilcraft.init.block.ModBlocks;
-import dev.dubhe.anvilcraft.recipe.anvil.wrap.NeutronIrradiationRecipe;
-import dev.dubhe.anvilcraft.util.CauldronUtil;
-import guideme.render.RenderContext;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.world.level.block.Block;
-import net.minecraft.world.level.block.Blocks;
-import net.minecraft.world.level.block.state.BlockState;
-
-public class LytNeutronIrradiationRecipe extends BetterLytVBox {
- private final NeutronIrradiationRecipe recipe;
-
- public LytNeutronIrradiationRecipe(NeutronIrradiationRecipe recipe) {
- this.recipe = recipe;
- }
-
- @Override
- public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
-
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.ANVIL.defaultBlockState(),
- 81,
- 12 + ANVIL_ANIMATION,
- 20,
- 12,
- RenderSupport.SINGLE_BLOCK
- );
- Block material = recipe.getHasCauldron().getFluidCauldron();
- RenderSupport.renderBlock(
- guiGraphics,
- CauldronUtil.fullState(material),
- 81,
- 30,
- 10,
- 12,
- RenderSupport.SINGLE_BLOCK
- );
-
- BlockState block = ModBlocks.NEUTRON_IRRADIATOR
- .get()
- .defaultBlockState();
-
- RenderSupport.renderBlock(
- guiGraphics,
- block,
- 81,
- 40,
- 0,
- 12,
- RenderSupport.SINGLE_BLOCK
- );
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytSqueezingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytSqueezingRecipe.java
deleted file mode 100644
index 29df9bc..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytSqueezingRecipe.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.anvilcraft.lib.recipe.component.BlockStatePredicate;
-import dev.anvilcraft.lib.recipe.component.ChanceBlockState;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
-import dev.dubhe.anvilcraft.recipe.anvil.predicate.block.HasCauldron;
-import dev.dubhe.anvilcraft.recipe.anvil.wrap.SqueezingRecipe;
-import dev.dubhe.anvilcraft.util.CauldronUtil;
-import guideme.render.RenderContext;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.world.level.block.Blocks;
-import net.minecraft.world.level.block.state.BlockState;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class LytSqueezingRecipe extends BetterLytVBox {
- private final SqueezingRecipe recipe;
-
- public LytSqueezingRecipe(SqueezingRecipe recipe) {
- this.recipe = recipe;
- }
-
- @Override
- public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
-
- RenderSupport.renderBlock(
- guiGraphics,
- Blocks.ANVIL.defaultBlockState(),
- 50,
- 12 + ANVIL_ANIMATION,
- 20,
- 12,
- RenderSupport.SINGLE_BLOCK
- );
-
- List input = new ArrayList<>();
- for (BlockStatePredicate predicate : recipe.getInputBlocks()) {
- input.addAll(predicate.constructStatesForRender());
- }
- if (input.isEmpty()) return;
- BlockState renderedState = input.get((int) ((System.currentTimeMillis() / 1000) % input.size()));
- if (renderedState == null) return;
- RenderSupport.renderBlock(guiGraphics, renderedState, 50, 30, 10, 12, RenderSupport.SINGLE_BLOCK);
- RenderSupport.renderBlock(guiGraphics, Blocks.CAULDRON.defaultBlockState(), 50, 40, 0, 12, RenderSupport.SINGLE_BLOCK);
-
- RenderSupport.renderBlock(guiGraphics, Blocks.ANVIL.defaultBlockState(), 110, 20, 20, 12, RenderSupport.SINGLE_BLOCK);
- RenderSupport.renderBlock(guiGraphics, getCauldron(recipe), 110, 40, 0, 12, RenderSupport.SINGLE_BLOCK);
- List result = recipe.getResultBlocks();
- if (result.isEmpty()) return;
- renderedState = result.get((int) ((System.currentTimeMillis() / 1000) % result.size())).state();
- RenderSupport.renderBlock(guiGraphics, renderedState, 110, 30, 10, 12, RenderSupport.SINGLE_BLOCK);
- }
-
- static BlockState getCauldron(SqueezingRecipe recipe) {
- if (recipe.isProduceFluid()) {
- return Blocks.CAULDRON.defaultBlockState();
- } else {
- return CauldronUtil.fullState(HasCauldron.getDefaultCauldron(recipe.getHasCauldron().transform()));
- }
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytStampingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytStampingRecipe.java
deleted file mode 100644
index 083d721..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytStampingRecipe.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-
-public class LytStampingRecipe extends BetterLytVBox {
-
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytVoidDecayRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytVoidDecayRecipe.java
deleted file mode 100644
index 9001cef..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytVoidDecayRecipe.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package dev.anvilcraft.guideme.recipe.anvil;
-
-import com.google.common.collect.ImmutableList;
-import dev.anvilcraft.guideme.recipe.box.BetterLytVBox;
-import dev.dubhe.anvilcraft.client.support.RenderSupport;
-import dev.dubhe.anvilcraft.integration.jei.recipe.VoidDecayRecipe;
-import dev.dubhe.anvilcraft.util.LevelLike;
-import guideme.render.RenderContext;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.GuiGraphics;
-import net.minecraft.core.BlockPos;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class LytVoidDecayRecipe extends BetterLytVBox {
- private final VoidDecayRecipe recipe;
- private final Map cache = new HashMap<>();
-
- private static final ImmutableList CATALYST_POS = ImmutableList.of(
- new BlockPos(1, 0, 1),
- new BlockPos(1, 1, 0),
- new BlockPos(1, 1, 2),
- new BlockPos(1, 2, 1),
- new BlockPos(0, 1, 1)
- );
- private static final BlockPos CENTER_POS = new BlockPos(1, 1, 1);
-
- public LytVoidDecayRecipe(VoidDecayRecipe recipe) {
- this.recipe = recipe;
- }
-
- @Override
- public void render(RenderContext context) {
- GuiGraphics guiGraphics = context.guiGraphics();
-
- LevelLike level = cache.get(recipe);
- if (level == null) {
- LevelLike showCase = new LevelLike(Minecraft.getInstance().level);
- CATALYST_POS.forEach(pos -> showCase.setBlockState(pos, recipe.catalyst.defaultBlockState()));
- showCase.setBlockState(CENTER_POS, recipe.center.defaultBlockState());
- cache.put(recipe, showCase);
- level = showCase;
- }
-
- RenderSupport.renderLevelLike(level, guiGraphics, 24, 36, 60, 0.5f);
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/box/BetterLytVBox.java b/src/main/java/dev/anvilcraft/guideme/recipe/box/BetterLytVBox.java
deleted file mode 100644
index 90c4abb..0000000
--- a/src/main/java/dev/anvilcraft/guideme/recipe/box/BetterLytVBox.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package dev.anvilcraft.guideme.recipe.box;
-
-import dev.anvilcraft.guideme.util.GuideMERenderUtil;
-import guideme.document.block.LytVBox;
-
-public abstract class BetterLytVBox extends LytVBox {
- protected static float ANVIL_ANIMATION = GuideMERenderUtil.getAnvilAnimationOffset();
-
- public int getSafeX() {
- return bounds.width() / 2 + bounds.x();
- }
-
- public int getSafeY() {
- return bounds.height() / 2 + bounds.y();
- }
-}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/box/LytBlockSlot.java b/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytBlockSlot.java
similarity index 96%
rename from src/main/java/dev/anvilcraft/guideme/recipe/box/LytBlockSlot.java
rename to src/main/java/dev/anvilcraft/guideme/recipe/slot/LytBlockSlot.java
index 5acea59..9cc7f5d 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/box/LytBlockSlot.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytBlockSlot.java
@@ -1,7 +1,6 @@
-package dev.anvilcraft.guideme.recipe.box;
+package dev.anvilcraft.guideme.recipe.slot;
import dev.anvilcraft.guideme.util.GuideMERenderUtil;
-import dev.anvilcraft.guideme.util.TextureConstants;
import dev.anvilcraft.lib.recipe.component.BlockStatePredicate;
import guideme.document.LytRect;
import guideme.document.block.LytBox;
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytInputItemSlot.java b/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytInputItemSlot.java
new file mode 100644
index 0000000..a497147
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytInputItemSlot.java
@@ -0,0 +1,138 @@
+package dev.anvilcraft.guideme.recipe.slot;
+
+import dev.anvilcraft.lib.recipe.component.ItemIngredientPredicate;
+import guideme.document.LytRect;
+import guideme.document.block.LytBlock;
+import guideme.document.interaction.GuideTooltip;
+import guideme.document.interaction.InteractiveElement;
+import guideme.document.interaction.ItemTooltip;
+import guideme.layout.LayoutContext;
+import guideme.render.GuiAssets;
+import guideme.render.GuiSprite;
+import guideme.render.RenderContext;
+import net.minecraft.client.renderer.MultiBufferSource;
+import net.minecraft.world.item.ItemStack;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+
+public class LytInputItemSlot extends LytBlock implements InteractiveElement {
+ private static final int ITEM_SIZE = 16;
+ private static final int CYCLE_TIME = 2000;
+
+ private final List mergedIngredients;
+
+ public LytInputItemSlot(List mergedIngredients) {
+ this.mergedIngredients = mergedIngredients;
+ }
+
+ @Override
+ protected LytRect computeLayout(LayoutContext context, int x, int y, int availableWidth) {
+ int size = mergedIngredients.size();
+ if (size == 0) return null;
+ if (size == 1) {
+ return new LytRect(x + 16, y + 16, ITEM_SIZE, ITEM_SIZE);
+ } else if (size <= 4) {
+ return new LytRect(x + 8, y + 8, ITEM_SIZE * 2, ITEM_SIZE * 2);
+ } else if (size <= 6) {
+ return new LytRect(x, y, ITEM_SIZE * 3, ITEM_SIZE * 2);
+ } else {
+ return new LytRect(x, y, ITEM_SIZE * 3, ITEM_SIZE * (size / 3));
+ }
+ }
+
+ @Override
+ public void render(RenderContext context) {
+ GuiSprite texture = GuiAssets.SLOT;
+ var x = bounds.x();
+ var y = bounds.y();
+ int size = mergedIngredients.size();
+ if (size == 1) {
+ ItemIngredientPredicate ingredient = mergedIngredients.getFirst();
+ LytRect lytRect = new LytRect(bounds.x(), bounds.y(), 18, 18);
+ context.renderItem(ingredient.getItems()[0], x + 1, y + 1, ITEM_SIZE, ITEM_SIZE);
+ context.fillIcon(lytRect, texture);
+ } else if (size <= 4) {
+ for (int i = 0; i < size; i++) {
+ int row = i / 2;
+ int col = i % 2;
+ ItemStack stack = getDisplayedStack(mergedIngredients.get(i).getItems());
+ LytRect lytRect = new LytRect(bounds.x() + 18 * col, bounds.y() + 18 * row, 18, 18);
+ context.fillIcon(lytRect, texture);
+ context.renderItem(stack, lytRect.x() + 1, lytRect.y() + 1, ITEM_SIZE, ITEM_SIZE);
+ }
+ } else if (size <= 6) {
+ for (int i = 0; i < size; i++) {
+ int row = i / 3;
+ int col = i % 3;
+ ItemStack stack = getDisplayedStack(mergedIngredients.get(i).getItems());
+ LytRect lytRect = new LytRect(bounds.x() + 18 * col, bounds.y() + 18 * row, 18, 18);
+ context.fillIcon(lytRect, texture);
+ context.renderItem(stack, lytRect.x() + 1, lytRect.y() + 1, ITEM_SIZE, ITEM_SIZE);
+ }
+ } else {
+ for (int i = 0; i < size; i++) {
+ if (i > 9) break;
+ int row = i / 3;
+ int col = i % 3;
+ ItemStack stack = getDisplayedStack(mergedIngredients.get(i).getItems());
+ LytRect lytRect = new LytRect(bounds.x() + 18 * col, bounds.y() + 18 * row, 18, 18);
+ context.fillIcon(lytRect, texture);
+ context.renderItem(stack, lytRect.x() + 1, lytRect.y() + 1, ITEM_SIZE, ITEM_SIZE);
+ }
+ }
+ }
+
+ @Override
+ public Optional getTooltip(float mouseX, float mouseY) {
+ int size = mergedIngredients.size();
+ if (size == 0) return Optional.empty();
+
+ if (size == 1) {
+ return Optional.of(new ItemTooltip(getDisplayedStack(mergedIngredients.getFirst().getItems())));
+ } else {
+ int cols;
+ if (size <= 4) {
+ cols = 2;
+ } else {
+ cols = 3;
+ }
+
+ int localMouseX = (int) (mouseX - bounds.x());
+ int localMouseY = (int) (mouseY - bounds.y());
+
+ if (localMouseX < 0 || localMouseY < 0) {
+ return Optional.empty();
+ }
+
+ int col = localMouseX / 18;
+ int row = localMouseY / 18;
+
+ int index = row * cols + col;
+
+ if (index < size) {
+ return Optional.of(new ItemTooltip(getDisplayedStack(mergedIngredients.get(index).getItems())));
+ }
+ }
+ return InteractiveElement.super.getTooltip(mouseX, mouseY);
+ }
+
+ private ItemStack getDisplayedStack(ItemStack[] stacks) {
+ if (stacks.length == 0) {
+ return ItemStack.EMPTY;
+ }
+ var cycle = System.nanoTime() / TimeUnit.MILLISECONDS.toNanos(CYCLE_TIME);
+ return stacks[(int) (cycle % stacks.length)];
+ }
+
+ @Override
+ protected void onLayoutMoved(int deltaX, int deltaY) {
+
+ }
+
+ @Override
+ public void renderBatch(RenderContext context, MultiBufferSource buffers) {
+
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytOutputItemSlot.java b/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytOutputItemSlot.java
new file mode 100644
index 0000000..091cb50
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytOutputItemSlot.java
@@ -0,0 +1,128 @@
+package dev.anvilcraft.guideme.recipe.slot;
+
+import dev.anvilcraft.guideme.recipe.tooltip.ChanceItemTooltip;
+import dev.anvilcraft.lib.recipe.component.ChanceItemStack;
+import guideme.document.LytRect;
+import guideme.document.block.LytBlock;
+import guideme.document.interaction.GuideTooltip;
+import guideme.document.interaction.InteractiveElement;
+import guideme.layout.LayoutContext;
+import guideme.render.GuiAssets;
+import guideme.render.GuiSprite;
+import guideme.render.RenderContext;
+import net.minecraft.client.renderer.MultiBufferSource;
+import net.minecraft.world.item.ItemStack;
+
+import java.util.List;
+import java.util.Optional;
+
+public class LytOutputItemSlot extends LytBlock implements InteractiveElement {
+ private static final int ITEM_SIZE = 16;
+
+ private final List resultItems;
+
+ public LytOutputItemSlot(List resultItems) {
+ this.resultItems = resultItems;
+ }
+
+ @Override
+ protected LytRect computeLayout(LayoutContext context, int x, int y, int availableWidth) {
+ int size = resultItems.size();
+ if (size == 0) return null;
+ if (size == 1) {
+ return new LytRect(x + 16, y + 16, ITEM_SIZE, ITEM_SIZE);
+ } else if (size <= 4) {
+ return new LytRect(x + 8, y + 8, ITEM_SIZE * 2, ITEM_SIZE * 2);
+ } else if (size <= 6) {
+ return new LytRect(x, y, ITEM_SIZE * 3, ITEM_SIZE * 2);
+ } else {
+ return new LytRect(x, y, ITEM_SIZE * 3, ITEM_SIZE * (size / 3));
+ }
+ }
+
+ @Override
+ public void render(RenderContext context) {
+ GuiSprite texture = GuiAssets.SLOT;
+ var x = bounds.x();
+ var y = bounds.y();
+ int size = resultItems.size();
+ if (size == 1) {
+ ItemStack stack = resultItems.getFirst().stack();
+ LytRect lytRect = new LytRect(bounds.x(), bounds.y(), 18, 18);
+ context.renderItem(stack, x + 1, y + 1, ITEM_SIZE, ITEM_SIZE);
+ context.fillIcon(lytRect, texture);
+ } else if (size <= 4) {
+ for (int i = 0; i < size; i++) {
+ int row = i / 2;
+ int col = i % 2;
+ ItemStack stack = resultItems.get(i).stack();
+ LytRect lytRect = new LytRect(bounds.x() + 18 * col, bounds.y() + 18 * row, 18, 18);
+ context.fillIcon(lytRect, texture);
+ context.renderItem(stack, lytRect.x() + 1, lytRect.y() + 1, ITEM_SIZE, ITEM_SIZE);
+ }
+ } else if (size <= 6) {
+ for (int i = 0; i < size; i++) {
+ int row = i / 3;
+ int col = i % 3;
+ ItemStack stack = resultItems.get(i).stack();
+ LytRect lytRect = new LytRect(bounds.x() + 18 * col, bounds.y() + 18 * row, 18, 18);
+ context.fillIcon(lytRect, texture);
+ context.renderItem(stack, lytRect.x() + 1, lytRect.y() + 1, ITEM_SIZE, ITEM_SIZE);
+ }
+ } else {
+ for (int i = 0; i < size; i++) {
+ if (i > 9) break;
+ int row = i / 3;
+ int col = i % 3;
+ ItemStack stack = resultItems.get(i).stack();
+ LytRect lytRect = new LytRect(bounds.x() + 18 * col, bounds.y() + 18 * row, 18, 18);
+ context.fillIcon(lytRect, texture);
+ context.renderItem(stack, lytRect.x() + 1, lytRect.y() + 1, ITEM_SIZE, ITEM_SIZE);
+ }
+ }
+ }
+
+ @Override
+ public Optional getTooltip(float mouseX, float mouseY) {
+ int size = resultItems.size();
+ if (size == 0) return Optional.empty();
+
+ if (size == 1) {
+ return Optional.of(new ChanceItemTooltip(resultItems.getFirst()));
+ } else {
+ int cols;
+ if (size <= 4) {
+ cols = 2;
+ } else {
+ cols = 3;
+ }
+
+ int localMouseX = (int) (mouseX - bounds.x());
+ int localMouseY = (int) (mouseY - bounds.y());
+
+ if (localMouseX < 0 || localMouseY < 0) {
+ return Optional.empty();
+ }
+
+ int col = localMouseX / 18;
+ int row = localMouseY / 18;
+
+ int index = row * cols + col;
+
+ if (index < size) {
+ return Optional.of(new ChanceItemTooltip(resultItems.get(index)));
+ }
+ }
+ return InteractiveElement.super.getTooltip(mouseX, mouseY);
+ }
+
+ @Override
+ protected void onLayoutMoved(int deltaX, int deltaY) {
+
+ }
+
+ @Override
+ public void renderBatch(RenderContext context, MultiBufferSource buffers) {
+
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/tooltip/ChanceItemTooltip.java b/src/main/java/dev/anvilcraft/guideme/recipe/tooltip/ChanceItemTooltip.java
new file mode 100644
index 0000000..731cf4e
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/tooltip/ChanceItemTooltip.java
@@ -0,0 +1,105 @@
+package dev.anvilcraft.guideme.recipe.tooltip;
+
+import dev.anvilcraft.lib.recipe.component.ChanceItemStack;
+import dev.anvilcraft.lib.util.NumberProviderUtil;
+import guideme.document.interaction.GuideTooltip;
+import guideme.siteexport.ResourceExporter;
+import net.minecraft.ChatFormatting;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.screens.Screen;
+import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
+import net.minecraft.network.chat.Component;
+import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator;
+import net.minecraft.world.level.storage.loot.providers.number.ConstantValue;
+import net.minecraft.world.level.storage.loot.providers.number.NumberProvider;
+import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator;
+
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ChanceItemTooltip implements GuideTooltip {
+ private static final DecimalFormat FORMATTER = new DecimalFormat();
+
+ private final ChanceItemStack chanceItemStack;
+
+ public ChanceItemTooltip(ChanceItemStack chanceItemStack) {
+ this.chanceItemStack = chanceItemStack;
+ }
+
+ @Override
+ public ItemStack getIcon() {
+ return chanceItemStack.stack();
+ }
+
+ @Override
+ public List getLines() {
+ List list = new ArrayList<>();
+ NumberProvider provider = chanceItemStack.count();
+ int count = chanceItemStack.stack().getCount();
+
+ if (provider instanceof BinomialDistributionGenerator(NumberProvider n, NumberProvider p)) {
+ if (n instanceof ConstantValue(float value) && value == 1) {
+ String chance = FORMATTER.format(NumberProviderUtil.expected(p) * 100);
+ list.add(Component.translatable("gui.anvilcraft.category.chance", chance)
+ .withStyle(ChatFormatting.GRAY));
+ } else {
+ addAvgOutput(list, count * NumberProviderUtil.expected(provider));
+ }
+ addMinMax(list, 0, getMax(n));
+ } else if (provider.getClass() != ConstantValue.class) {
+ double val = count * NumberProviderUtil.expected(provider);
+ if (val != -1) {
+ addAvgOutput(list, val);
+ if (provider instanceof UniformGenerator) {
+ addMinMax(list, getMin(provider), getMax(provider));
+ }
+ }
+ }
+
+ list.addAll(Screen.getTooltipFromItem(Minecraft.getInstance(), chanceItemStack.stack()));
+ return list.stream()
+ .map(Component::getVisualOrderText)
+ .map(ClientTooltipComponent::create)
+ .toList();
+ }
+
+ @Override
+ public void exportResources(ResourceExporter exporter) {
+ exporter.referenceItem(chanceItemStack.stack());
+ }
+
+ private static double getMin(NumberProvider provider) {
+ return switch (provider) {
+ case ConstantValue value -> value.value();
+ case UniformGenerator uniform -> getMin(uniform.min());
+ default -> 0;
+ };
+ }
+
+ private static double getMax(NumberProvider provider) {
+ return switch (provider) {
+ case ConstantValue value -> value.value();
+ case UniformGenerator uniform -> getMax(uniform.max());
+ case BinomialDistributionGenerator binomial -> getMax(binomial.n());
+ default -> 0;
+ };
+ }
+
+ private static void addAvgOutput(List tooltipLines, double avgValue) {
+ String avgOutput = FORMATTER.format(avgValue);
+ tooltipLines.add(Component.translatable("gui.anvilcraft.category.average_output", avgOutput)
+ .withStyle(ChatFormatting.GRAY));
+ }
+
+ private static void addMinMax(List tooltipLines, double min, double max) {
+ String minOutput = FORMATTER.format(min);
+ String maxOutput = FORMATTER.format(max);
+
+ tooltipLines.add(Component.translatable("gui.anvilcraft.category.min_output", minOutput)
+ .withStyle(ChatFormatting.GRAY));
+ tooltipLines.add(Component.translatable("gui.anvilcraft.category.max_output", maxOutput)
+ .withStyle(ChatFormatting.GRAY));
+ }
+}
From 114714225a93fd3415a70d5e6ed76335160997ce Mon Sep 17 00:00:00 2001
From: theabab2333 <2047477146@qq.com>
Date: Sun, 21 Dec 2025 22:10:55 +0800
Subject: [PATCH 05/27] =?UTF-8?q?feat(guide):=20=E6=96=B0=E5=A2=9E?=
=?UTF-8?q?=E5=A4=9A=E7=A7=8D=E9=85=8D=E6=96=B9=E7=B1=BB=E5=9E=8B=E6=94=AF?=
=?UTF-8?q?=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 添加 Bulging、Cooking、ItemCompress、ItemCrush 等新配方类型的布局渲染
- 实现 Mesh 和 MassInject 配方的界面展示逻辑
- 重构 BlockCompress、BlockCrush 等旧配方类去除冗余 Slot 元素
- 优化 LytBlockSlot 渲染逻辑,增加 hasAnvil 属性控制动画显示
- 调整输入输出槽位尺寸计算方式,统一使用 SLOT_SIZE 常量
- 更新配方注册系统以支持新增的配方类型贡献
- 修改指南书索引文件内容,替换原有配方示例为 mesh 类型配方
- 扩展访问转换配置文件,开放 SmithingRecipe 相关字段访问权限
---
guidebook/index.md | 7 +-
.../recipe/RecipeTypeContributions.java | 121 ++++++++++++++++++
.../recipe/anvil/LytBlockCompressRecipe.java | 16 +--
.../recipe/anvil/LytBlockCrushRecipe.java | 11 +-
.../recipe/anvil/LytBlockSmearRecipe.java | 21 +--
.../recipe/anvil/LytBoilingRecipe.java | 8 +-
.../recipe/anvil/LytBulgingRecipe.java | 78 +++++++++++
.../recipe/anvil/LytCookingRecipe.java | 48 +++++++
.../recipe/anvil/LytItemCompressRecipe.java | 46 +++++++
.../recipe/anvil/LytItemCrushRecipe.java | 46 +++++++
.../recipe/anvil/LytItemInjectRecipe.java | 38 ++++++
.../recipe/anvil/LytMassInjectRecipe.java | 71 ++++++++++
.../guideme/recipe/anvil/LytMeshRecipe.java | 46 +++++++
.../guideme/recipe/slot/LytBlockSlot.java | 25 +++-
.../guideme/recipe/slot/LytInputItemSlot.java | 17 +--
.../recipe/slot/LytOutputItemSlot.java | 17 +--
.../recipe/tooltip/ChanceItemTooltip.java | 7 +-
.../guideme/util/GuideMERenderUtil.java | 37 +++---
.../resources/META-INF/accesstransformer.cfg | 9 ++
19 files changed, 581 insertions(+), 88 deletions(-)
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBulgingRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytCookingRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCompressRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCrushRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemInjectRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMassInjectRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMeshRecipe.java
diff --git a/guidebook/index.md b/guidebook/index.md
index ed22e8d..a01d196 100644
--- a/guidebook/index.md
+++ b/guidebook/index.md
@@ -22,6 +22,7 @@ navigation:
* 压合:将两个方块压成一个
* 方块破坏:破坏切石机上的方块
-
-// beef_mushroom_stew
-// slime_ball
\ No newline at end of file
+
+// cement_cauldron
+// utusan
+// prismarine_cluster
\ No newline at end of file
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/RecipeTypeContributions.java b/src/main/java/dev/anvilcraft/guideme/recipe/RecipeTypeContributions.java
index 2f8852d..56ad2e1 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/RecipeTypeContributions.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/RecipeTypeContributions.java
@@ -4,23 +4,46 @@
import dev.anvilcraft.guideme.recipe.anvil.LytBlockCrushRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytBlockSmearRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytBoilingRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytBulgingRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytCookingRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytItemCompressRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytItemCrushRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytItemInjectRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytMassInjectRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytMeshRecipe;
+import dev.dubhe.anvilcraft.init.item.ModItems;
import dev.dubhe.anvilcraft.init.reicpe.ModRecipeTypes;
+import dev.dubhe.anvilcraft.recipe.anvil.MassInjectRecipe;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockCompressRecipe;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockCrushRecipe;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockSmearRecipe;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BoilingRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.BulgingRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.CookingRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.ItemCompressRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.ItemCrushRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.ItemInjectRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.MeshRecipe;
import guideme.compiler.tags.RecipeTypeMappingSupplier;
import guideme.document.block.recipes.LytStandardRecipeBox;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.RecipeHolder;
public class RecipeTypeContributions implements RecipeTypeMappingSupplier {
+
@Override
public void collect(RecipeTypeMappings mappings) {
mappings.add(ModRecipeTypes.BLOCK_COMPRESS_TYPE.get(), RecipeTypeContributions::blockCompress);
mappings.add(ModRecipeTypes.BLOCK_CRUSH_TYPE.get(), RecipeTypeContributions::blockCrush);
mappings.add(ModRecipeTypes.BLOCK_SMEAR_TYPE.get(), RecipeTypeContributions::blockSmear);
mappings.add(ModRecipeTypes.BOILING_TYPE.get(), RecipeTypeContributions::boiling);
+ mappings.add(ModRecipeTypes.BULGING_TYPE.get(), RecipeTypeContributions::bulging);
+ mappings.add(ModRecipeTypes.COOKING_TYPE.get(), RecipeTypeContributions::cooking);
+ mappings.add(ModRecipeTypes.ITEM_COMPRESS_TYPE.get(), RecipeTypeContributions::itemCompress);
+ mappings.add(ModRecipeTypes.ITEM_CRUSH_TYPE.get(), RecipeTypeContributions::itemCrush);
+ mappings.add(ModRecipeTypes.ITEM_INJECT_TYPE.get(), RecipeTypeContributions::itemInject);
+ mappings.add(ModRecipeTypes.MASS_INJECT_TYPE.get(), RecipeTypeContributions::massInject);
+ mappings.add(ModRecipeTypes.MESH_TYPE.get(), RecipeTypeContributions::mesh);
}
private static LytStandardRecipeBox blockCompress(RecipeHolder holder) {
@@ -90,4 +113,102 @@ private static LytStandardRecipeBox boiling(RecipeHolder bulging(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytBulgingRecipe(holder.value()))
+ .build(holder);
+ }
+ private static LytStandardRecipeBox cooking(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytCookingRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getResultItems()
+ .getFirst()
+ .getItem()
+ .getDescription()
+ .getString()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox itemCompress(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytItemCompressRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getResultItems()
+ .getFirst()
+ .getItem()
+ .getDescription()
+ .getString()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox itemCrush(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytItemCrushRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getResultItems()
+ .getFirst()
+ .getItem()
+ .getDescription()
+ .getString()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox itemInject(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytItemInjectRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getFirstResultBlock()
+ .state()
+ .getBlock()
+ .asItem()
+ .getDescription()
+ .getString()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox massInject(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytMassInjectRecipe(holder.value()))
+ .title(
+ ModItems.NEUTRONIUM_INGOT.asItem().getDescription().getString()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox mesh(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytMeshRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getResultItems()
+ .getFirst()
+ .getItem()
+ .getDescription()
+ .getString()
+ )
+ .build(holder);
+ }
}
\ No newline at end of file
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCompressRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCompressRecipe.java
index c18fdfc..01ec682 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCompressRecipe.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCompressRecipe.java
@@ -4,7 +4,6 @@
import dev.anvilcraft.guideme.util.BlockStateUtil;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockCompressRecipe;
import guideme.document.LytRect;
-import guideme.document.block.LytSlot;
import guideme.document.block.LytVBox;
import guideme.layout.LayoutContext;
import guideme.render.RenderContext;
@@ -12,9 +11,6 @@
public class LytBlockCompressRecipe extends LytVBox {
private final LytBlockSlot inputBlocks;
private final LytBlockSlot outputBlocks;
- private final LytSlot inputFirstSlot;
- private final LytSlot inputSecondSlot;
- private final LytSlot outputSlot;
public LytBlockCompressRecipe(BlockCompressRecipe recipe) {
append(inputBlocks = new LytBlockSlot(recipe.getInputBlocks()));
@@ -26,28 +22,20 @@ public LytBlockCompressRecipe(BlockCompressRecipe recipe) {
)
);
inputBlocks.setAnvilAnimation(true);
-
- append(inputFirstSlot = new LytSlot(BlockStateUtil.transToIngredient(inputBlocks.blockStatePredicates.getFirst())));
- append(inputSecondSlot = new LytSlot(BlockStateUtil.transToIngredient(inputBlocks.blockStatePredicates.getLast())));
- append(outputSlot = new LytSlot(BlockStateUtil.transToIngredient(outputBlocks.blockStatePredicates.getFirst())));
+ inputBlocks.setHasAnvil(true);
+ outputBlocks.setHasAnvil(true);
}
@Override
public void render(RenderContext context) {
inputBlocks.render(context);
outputBlocks.render(context);
- inputFirstSlot.render(context);
- inputSecondSlot.render(context);
- outputSlot.render(context);
}
@Override
protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
inputBlocks.layout(context, x + 20, y - 2, availableWidth);
outputBlocks.layout(context, x + 50, y + 15, availableWidth);
- inputFirstSlot.layout(context, x, y + 10, availableWidth);
- inputSecondSlot.layout(context, x, y + 30, availableWidth);
- outputSlot.layout(context, x + 70, y + 30, availableWidth);
int size = Math.max(inputBlocks.blockStatePredicates.size(), outputBlocks.blockStatePredicates.size());
return new LytRect(x, y, 90, size * 24);
}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCrushRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCrushRecipe.java
index d23085a..b5c8ebd 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCrushRecipe.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockCrushRecipe.java
@@ -4,7 +4,6 @@
import dev.anvilcraft.guideme.util.BlockStateUtil;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockCrushRecipe;
import guideme.document.LytRect;
-import guideme.document.block.LytSlot;
import guideme.document.block.LytVBox;
import guideme.layout.LayoutContext;
import guideme.render.RenderContext;
@@ -12,8 +11,6 @@
public class LytBlockCrushRecipe extends LytVBox {
private final LytBlockSlot inputBlocks;
private final LytBlockSlot outputBlocks;
- private final LytSlot inputSlot;
- private final LytSlot outputSlot;
public LytBlockCrushRecipe(BlockCrushRecipe recipe) {
@@ -26,24 +23,20 @@ public LytBlockCrushRecipe(BlockCrushRecipe recipe) {
)
);
inputBlocks.setAnvilAnimation(true);
- append(inputSlot = new LytSlot(BlockStateUtil.transToIngredient(inputBlocks.blockStatePredicates.getFirst())));
- append(outputSlot = new LytSlot(BlockStateUtil.transToIngredient(outputBlocks.blockStatePredicates.getFirst())));
+ inputBlocks.setHasAnvil(true);
+ outputBlocks.setHasAnvil(true);
}
@Override
public void render(RenderContext context) {
inputBlocks.render(context);
outputBlocks.render(context);
- inputSlot.render(context);
- outputSlot.render(context);
}
@Override
protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
inputBlocks.layout(context, x + 20, y + 10, availableWidth);
outputBlocks.layout(context, x + 50, y + 10, availableWidth);
- inputSlot.layout(context, x, y + 23, availableWidth);
- outputSlot.layout(context, x + 70, y + 23, availableWidth);
return new LytRect(x, y, 90, 42);
}
}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockSmearRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockSmearRecipe.java
index 4cf405c..cc9d243 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockSmearRecipe.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBlockSmearRecipe.java
@@ -4,7 +4,6 @@
import dev.anvilcraft.guideme.util.BlockStateUtil;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockSmearRecipe;
import guideme.document.LytRect;
-import guideme.document.block.LytSlot;
import guideme.document.block.LytVBox;
import guideme.layout.LayoutContext;
import guideme.render.RenderContext;
@@ -12,9 +11,6 @@
public class LytBlockSmearRecipe extends LytVBox {
private final LytBlockSlot inputBlocks;
private final LytBlockSlot outputBlocks;
- private final LytSlot inputFirstSlot;
- private final LytSlot inputSecondSlot;
- private final LytSlot outputSlot;
public LytBlockSmearRecipe(BlockSmearRecipe recipe) {
append(inputBlocks = new LytBlockSlot(recipe.getInputBlocks()));
@@ -26,29 +22,20 @@ public LytBlockSmearRecipe(BlockSmearRecipe recipe) {
)
);
inputBlocks.setAnvilAnimation(true);
-
- append(inputFirstSlot = new LytSlot(BlockStateUtil.transToIngredient(inputBlocks.blockStatePredicates.getFirst())));
- append(inputSecondSlot = new LytSlot(BlockStateUtil.transToIngredient(inputBlocks.blockStatePredicates.getLast())));
- append(outputSlot = new LytSlot(BlockStateUtil.transToIngredient(outputBlocks.blockStatePredicates.getFirst())));
+ inputBlocks.setHasAnvil(true);
+ outputBlocks.setHasAnvil(true);
}
@Override
public void render(RenderContext context) {
inputBlocks.render(context);
outputBlocks.render(context);
- inputFirstSlot.render(context);
- inputSecondSlot.render(context);
- outputSlot.render(context);
}
@Override
protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
inputBlocks.layout(context, x + 20, y - 2, availableWidth);
- outputBlocks.layout(context, x + 50, y + 15, availableWidth);
- inputFirstSlot.layout(context, x, y + 10, availableWidth);
- inputSecondSlot.layout(context, x, y + 30, availableWidth);
- outputSlot.layout(context, x + 70, y + 30, availableWidth);
- int size = Math.max(inputBlocks.blockStatePredicates.size(), outputBlocks.blockStatePredicates.size());
- return new LytRect(x, y, 90, size * 24);
+ outputBlocks.layout(context, x + 87, y + 15, availableWidth);
+ return new LytRect(x, y, 162, 64);
}
}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBoilingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBoilingRecipe.java
index 888ec5c..04807ae 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBoilingRecipe.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBoilingRecipe.java
@@ -28,7 +28,7 @@ public LytBoilingRecipe(BoilingRecipe recipe) {
work.add(BlockStatePredicate.builder().of(Blocks.CAMPFIRE).with(CampfireBlock.LIT, true).build());
append(workBlocks = new LytBlockSlot(work));
workBlocks.setAnvilAnimation(true);
-
+ workBlocks.setHasAnvil(true);
append(inputItemSlot = new LytInputItemSlot(recipe.getInputItems()));
append(outputItemSlot = new LytOutputItemSlot(recipe.getResultItems()));
}
@@ -42,9 +42,9 @@ public void render(RenderContext context) {
@Override
protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
- workBlocks.layout(context, x + 50, y, availableWidth);
+ workBlocks.layout(context, x + 70, y, availableWidth);
inputItemSlot.layout(context, x, y, availableWidth);
- outputItemSlot.layout(context, x + 68, y, availableWidth);
- return new LytRect(x, y, 120, 48);
+ outputItemSlot.layout(context, x + 87, y, availableWidth);
+ return new LytRect(x, y, 162, 64);
}
}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBulgingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBulgingRecipe.java
new file mode 100644
index 0000000..20f69e5
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBulgingRecipe.java
@@ -0,0 +1,78 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.anvilcraft.guideme.recipe.slot.LytInputItemSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytOutputItemSlot;
+import dev.anvilcraft.guideme.util.GuideMERenderUtil;
+import dev.dubhe.anvilcraft.client.support.RenderSupport;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.BulgingRecipe;
+import dev.dubhe.anvilcraft.recipe.component.HasCauldronSimple;
+import dev.dubhe.anvilcraft.util.CauldronUtil;
+import guideme.document.LytRect;
+import guideme.document.block.LytVBox;
+import guideme.layout.LayoutContext;
+import guideme.render.RenderContext;
+import net.minecraft.client.gui.GuiGraphics;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.state.BlockState;
+
+public class LytBulgingRecipe extends LytVBox {
+ private final LytInputItemSlot inputItemSlot;
+ private final LytOutputItemSlot outputItemSlot;
+ private final BulgingRecipe recipe;
+
+ public LytBulgingRecipe(BulgingRecipe recipe) {
+ this.recipe = recipe;
+ append(inputItemSlot = new LytInputItemSlot(recipe.getInputItems()));
+ append(outputItemSlot = new LytOutputItemSlot(recipe.getResultItems()));
+ }
+
+ @Override
+ public void render(RenderContext context) {
+ inputItemSlot.render(context);
+ if (!recipe.getResultItems().isEmpty()) outputItemSlot.render(context);
+
+ GuiGraphics guiGraphics = context.guiGraphics();
+
+ RenderSupport.renderBlock(
+ guiGraphics,
+ Blocks.ANVIL.defaultBlockState(),
+ bounds.x() + 70,
+ bounds.y() + GuideMERenderUtil.getAnvilAnimationOffset() + 5,
+ 20,
+ 12,
+ RenderSupport.SINGLE_BLOCK);
+ BlockState state;
+ if (recipe.isFromWater()) {
+ state = CauldronUtil.fullState(Blocks.WATER_CAULDRON);
+ } else if (recipe.isProduceFluid()) {
+ state = Blocks.CAULDRON.defaultBlockState();
+ } else {
+ state = recipe.getHasCauldron().getTransformCauldron().defaultBlockState();
+ }
+ RenderSupport.renderBlock(guiGraphics, state, bounds.x() + 70, bounds.y() + 24, 10, 12, RenderSupport.SINGLE_BLOCK);
+
+ if (recipe.getResultItems().isEmpty()) {
+ Block result = recipe.getHasCauldron().getTransformCauldron();
+ if (recipe.isConsumeFluid()) {
+ state = CauldronUtil.getStateFromContentAndLevel(result, CauldronUtil.maxLevel(result) - 1);
+ } else if (recipe.isProduceFluid()) {
+ state = CauldronUtil.getStateFromContentAndLevel(result, 1);
+ } else {
+ state = CauldronUtil.fullState(result);
+ }
+ RenderSupport.renderBlock(guiGraphics, state, bounds.x() + 100, bounds.y() + 20, 0, 14, RenderSupport.SINGLE_BLOCK);
+ }
+ }
+
+ @Override
+ protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
+ inputItemSlot.layout(context, x, y, availableWidth);
+
+ if (!recipe.getResultItems().isEmpty()) {
+ outputItemSlot.layout(context, x + 87, y, availableWidth);
+ }
+
+ return new LytRect(x, y, 162, 64);
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytCookingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytCookingRecipe.java
new file mode 100644
index 0000000..80772ce
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytCookingRecipe.java
@@ -0,0 +1,48 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.anvilcraft.guideme.recipe.slot.LytBlockSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytInputItemSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytOutputItemSlot;
+import dev.anvilcraft.lib.recipe.component.BlockStatePredicate;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.CookingRecipe;
+import guideme.document.LytRect;
+import guideme.document.block.LytVBox;
+import guideme.layout.LayoutContext;
+import guideme.render.RenderContext;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.CampfireBlock;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LytCookingRecipe extends LytVBox {
+ private final LytBlockSlot workBlocks;
+ private final LytInputItemSlot inputItemSlot;
+ private final LytOutputItemSlot outputItemSlot;
+
+ public LytCookingRecipe(CookingRecipe recipe) {
+ List work = new ArrayList<>();
+ work.add(BlockStatePredicate.builder().of(Blocks.CAULDRON).build());
+ work.add(BlockStatePredicate.builder().of(Blocks.CAMPFIRE).with(CampfireBlock.LIT, true).build());
+ append(workBlocks = new LytBlockSlot(work));
+ workBlocks.setAnvilAnimation(true);
+ workBlocks.setHasAnvil(true);
+ append(inputItemSlot = new LytInputItemSlot(recipe.getInputItems()));
+ append(outputItemSlot = new LytOutputItemSlot(recipe.getResultItems()));
+ }
+
+ @Override
+ public void render(RenderContext context) {
+ workBlocks.render(context);
+ inputItemSlot.render(context);
+ outputItemSlot.render(context);
+ }
+
+ @Override
+ protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
+ workBlocks.layout(context, x + 70, y, availableWidth);
+ inputItemSlot.layout(context, x, y, availableWidth);
+ outputItemSlot.layout(context, x + 87, y, availableWidth);
+ return new LytRect(x, y, 162, 64);
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCompressRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCompressRecipe.java
new file mode 100644
index 0000000..3df599b
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCompressRecipe.java
@@ -0,0 +1,46 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.anvilcraft.guideme.recipe.slot.LytBlockSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytInputItemSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytOutputItemSlot;
+import dev.anvilcraft.lib.recipe.component.BlockStatePredicate;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.ItemCompressRecipe;
+import guideme.document.LytRect;
+import guideme.document.block.LytVBox;
+import guideme.layout.LayoutContext;
+import guideme.render.RenderContext;
+import net.minecraft.world.level.block.Blocks;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LytItemCompressRecipe extends LytVBox {
+ private final LytBlockSlot workBlocks;
+ private final LytInputItemSlot inputItemSlot;
+ private final LytOutputItemSlot outputItemSlot;
+
+ public LytItemCompressRecipe(ItemCompressRecipe recipe) {
+ List work = new ArrayList<>();
+ work.add(BlockStatePredicate.builder().of(Blocks.CAULDRON).build());
+ append(workBlocks = new LytBlockSlot(work));
+ workBlocks.setAnvilAnimation(true);
+ workBlocks.setHasAnvil(true);
+ append(inputItemSlot = new LytInputItemSlot(recipe.getInputItems()));
+ append(outputItemSlot = new LytOutputItemSlot(recipe.getResultItems()));
+ }
+
+ @Override
+ public void render(RenderContext context) {
+ workBlocks.render(context);
+ inputItemSlot.render(context);
+ outputItemSlot.render(context);
+ }
+
+ @Override
+ protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
+ workBlocks.layout(context, x + 70, y + 15, availableWidth);
+ inputItemSlot.layout(context, x, y, availableWidth);
+ outputItemSlot.layout(context, x + 87, y, availableWidth);
+ return new LytRect(x, y, 162, 64);
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCrushRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCrushRecipe.java
new file mode 100644
index 0000000..34b907c
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemCrushRecipe.java
@@ -0,0 +1,46 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.anvilcraft.guideme.recipe.slot.LytBlockSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytInputItemSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytOutputItemSlot;
+import dev.anvilcraft.lib.recipe.component.BlockStatePredicate;
+import dev.dubhe.anvilcraft.init.block.ModBlocks;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.ItemCrushRecipe;
+import guideme.document.LytRect;
+import guideme.document.block.LytVBox;
+import guideme.layout.LayoutContext;
+import guideme.render.RenderContext;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LytItemCrushRecipe extends LytVBox {
+ private final LytBlockSlot workBlocks;
+ private final LytInputItemSlot inputItemSlot;
+ private final LytOutputItemSlot outputItemSlot;
+
+ public LytItemCrushRecipe(ItemCrushRecipe recipe) {
+ List work = new ArrayList<>();
+ work.add(BlockStatePredicate.builder().of(ModBlocks.CRUSHING_TABLE).build());
+ append(workBlocks = new LytBlockSlot(work));
+ workBlocks.setAnvilAnimation(true);
+ workBlocks.setHasAnvil(true);
+ append(inputItemSlot = new LytInputItemSlot(recipe.getInputItems()));
+ append(outputItemSlot = new LytOutputItemSlot(recipe.getResultItems()));
+ }
+
+ @Override
+ public void render(RenderContext context) {
+ workBlocks.render(context);
+ inputItemSlot.render(context);
+ outputItemSlot.render(context);
+ }
+
+ @Override
+ protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
+ workBlocks.layout(context, x + 70, y + 15, availableWidth);
+ inputItemSlot.layout(context, x, y, availableWidth);
+ outputItemSlot.layout(context, x + 87, y, availableWidth);
+ return new LytRect(x, y, 162, 64);
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemInjectRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemInjectRecipe.java
new file mode 100644
index 0000000..a42d535
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytItemInjectRecipe.java
@@ -0,0 +1,38 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.anvilcraft.guideme.recipe.slot.LytBlockSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytInputItemSlot;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.ItemInjectRecipe;
+import guideme.document.LytRect;
+import guideme.document.block.LytVBox;
+import guideme.layout.LayoutContext;
+import guideme.render.RenderContext;
+
+public class LytItemInjectRecipe extends LytVBox {
+ private final LytBlockSlot inputBlockSlot;
+ private final LytBlockSlot outputBlockSlot;
+ private final LytInputItemSlot inputItemSlot;
+
+ public LytItemInjectRecipe(ItemInjectRecipe recipe) {
+ append(inputBlockSlot = new LytBlockSlot(recipe.getInputBlocks()));
+ append(outputBlockSlot = new LytBlockSlot(recipe.getFirstResultBlock().state()));
+ inputBlockSlot.setAnvilAnimation(true);
+ inputBlockSlot.setHasAnvil(true);
+ append(inputItemSlot = new LytInputItemSlot(recipe.getInputItems()));
+ }
+
+ @Override
+ public void render(RenderContext context) {
+ inputBlockSlot.render(context);
+ outputBlockSlot.render(context);
+ inputItemSlot.render(context);
+ }
+
+ @Override
+ protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
+ inputBlockSlot.layout(context, x + 70, y + 15, availableWidth);
+ outputBlockSlot.layout(context, x + 105, y + 15, availableWidth);
+ inputItemSlot.layout(context, x, y, availableWidth);
+ return new LytRect(x, y, 162, 64);
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMassInjectRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMassInjectRecipe.java
new file mode 100644
index 0000000..1b1940d
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMassInjectRecipe.java
@@ -0,0 +1,71 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.anvilcraft.guideme.recipe.slot.LytBlockSlot;
+import dev.anvilcraft.lib.recipe.component.BlockStatePredicate;
+import dev.dubhe.anvilcraft.init.block.ModBlocks;
+import dev.dubhe.anvilcraft.init.item.ModItems;
+import dev.dubhe.anvilcraft.recipe.anvil.MassInjectRecipe;
+import guideme.document.LytRect;
+import guideme.document.block.LytSlot;
+import guideme.document.block.LytVBox;
+import guideme.layout.LayoutContext;
+import guideme.render.RenderContext;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiGraphics;
+import net.minecraft.network.chat.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static dev.dubhe.anvilcraft.block.entity.SpaceOvercompressorBlockEntity.NEUTRONIUM_INGOT_MASS;
+
+public class LytMassInjectRecipe extends LytVBox {
+ private final LytBlockSlot workBlocks;
+ private final LytSlot inputItemSlot;
+ private final LytSlot outputItemSlot;
+ private final MassInjectRecipe recipe;
+
+ public LytMassInjectRecipe(MassInjectRecipe recipe) {
+ this.recipe = recipe;
+ List work = new ArrayList<>();
+ work.add(BlockStatePredicate.builder().of(ModBlocks.SPACE_OVERCOMPRESSOR).build());
+ append(workBlocks = new LytBlockSlot(work));
+ workBlocks.setAnvilAnimation(true);
+ workBlocks.setHasAnvil(true);
+ append(inputItemSlot = new LytSlot(recipe.getIngredient()));
+ append(outputItemSlot = new LytSlot(ModItems.NEUTRONIUM_INGOT.asStack()));
+ }
+
+ @Override
+ public void render(RenderContext context) {
+ workBlocks.render(context);
+ inputItemSlot.render(context);
+ outputItemSlot.render(context);
+
+ GuiGraphics guiGraphics = context.guiGraphics();
+ guiGraphics.drawString(
+ Minecraft.getInstance().font,
+ Component.translatable("gui.anvilcraft.category.mass_inject.mass_value", recipe.displayMassValue()),
+ bounds.x(),
+ bounds.y() + 5,
+ 0xFF000000,
+ false
+ );
+ guiGraphics.drawString(
+ Minecraft.getInstance().font,
+ Component.translatable("gui.anvilcraft.category.mass_inject.items_needed", Math.ceilDiv(NEUTRONIUM_INGOT_MASS, recipe.getMass())),
+ bounds.x(),
+ bounds.y() + 50,
+ 0xFF000000,
+ false
+ );
+ }
+
+ @Override
+ protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
+ workBlocks.layout(context, x + 70, y + 15, availableWidth);
+ inputItemSlot.layout(context, x + 35, y + 15, availableWidth);
+ outputItemSlot.layout(context, x + 102, y + 15, availableWidth);
+ return new LytRect(x, y, 162, 64);
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMeshRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMeshRecipe.java
new file mode 100644
index 0000000..816d41b
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMeshRecipe.java
@@ -0,0 +1,46 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.anvilcraft.guideme.recipe.slot.LytBlockSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytInputItemSlot;
+import dev.anvilcraft.guideme.recipe.slot.LytOutputItemSlot;
+import dev.anvilcraft.lib.recipe.component.BlockStatePredicate;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.MeshRecipe;
+import guideme.document.LytRect;
+import guideme.document.block.LytVBox;
+import guideme.layout.LayoutContext;
+import guideme.render.RenderContext;
+import net.minecraft.world.level.block.Blocks;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LytMeshRecipe extends LytVBox {
+ private final LytBlockSlot workBlocks;
+ private final LytInputItemSlot inputItemSlot;
+ private final LytOutputItemSlot outputItemSlot;
+
+ public LytMeshRecipe(MeshRecipe recipe) {
+ List work = new ArrayList<>();
+ work.add(BlockStatePredicate.builder().of(Blocks.SCAFFOLDING).build());
+ append(workBlocks = new LytBlockSlot(work));
+ workBlocks.setAnvilAnimation(true);
+ workBlocks.setHasAnvil(true);
+ append(inputItemSlot = new LytInputItemSlot(recipe.getInputItems()));
+ append(outputItemSlot = new LytOutputItemSlot(recipe.getResultItems()));
+ }
+
+ @Override
+ public void render(RenderContext context) {
+ workBlocks.render(context);
+ inputItemSlot.render(context);
+ outputItemSlot.render(context);
+ }
+
+ @Override
+ protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
+ workBlocks.layout(context, x + 70, y + 10, availableWidth);
+ inputItemSlot.layout(context, x + 15, y, availableWidth);
+ outputItemSlot.layout(context, x + 87, y, availableWidth);
+ return new LytRect(x, y, 162, 64);
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytBlockSlot.java b/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytBlockSlot.java
index 9cc7f5d..3ef490d 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytBlockSlot.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytBlockSlot.java
@@ -11,6 +11,7 @@
import lombok.Getter;
import lombok.Setter;
import net.minecraft.client.renderer.MultiBufferSource;
+import net.minecraft.world.level.block.state.BlockState;
import javax.annotation.Nullable;
import java.util.ArrayList;
@@ -18,8 +19,6 @@
import java.util.Objects;
import java.util.Optional;
-
-// 完全能用()
public class LytBlockSlot extends LytBox implements InteractiveElement {
private static final int WIDTH = 16;
private static final int HEIGHT = 16;
@@ -29,11 +28,22 @@ public class LytBlockSlot extends LytBox implements InteractiveElement {
@Setter
@Getter
private boolean anvilAnimation;
+ @Setter
+ @Getter
+ private boolean hasAnvil;
public LytBlockSlot(@Nullable List blockStatePredicates) {
this.blockStatePredicates = Objects.requireNonNullElseGet(blockStatePredicates, ArrayList::new);
}
+ public LytBlockSlot(BlockState blockState) {
+ BlockStatePredicate predicate = BlockStatePredicate
+ .builder()
+ .of(blockState.getBlock())
+ .build();
+ this.blockStatePredicates = List.of(predicate);
+ }
+
@Override
protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int availableWidth) {
int size = blockStatePredicates.size();
@@ -45,20 +55,27 @@ public void render(RenderContext context) {
int x = getSafeX();
int y = getSafeY();
if (blockStatePredicates.isEmpty()) return;
- if (anvilAnimation) {
+ if (anvilAnimation && hasAnvil) {
GuideMERenderUtil.renderedBlockStatesAndAnvilAnimation(
context.guiGraphics(),
blockStatePredicates,
x,
y
);
- } else {
+ } else if (hasAnvil) {
GuideMERenderUtil.renderedBlockStatesAndAnvil(
context.guiGraphics(),
blockStatePredicates,
x,
y
);
+ } else {
+ GuideMERenderUtil.renderedBlock(
+ context.guiGraphics(),
+ blockStatePredicates,
+ x,
+ y
+ );
}
}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytInputItemSlot.java b/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytInputItemSlot.java
index a497147..bd0c8f7 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytInputItemSlot.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytInputItemSlot.java
@@ -19,6 +19,7 @@
public class LytInputItemSlot extends LytBlock implements InteractiveElement {
private static final int ITEM_SIZE = 16;
+ private static final int SLOT_SIZE = 18;
private static final int CYCLE_TIME = 2000;
private final List mergedIngredients;
@@ -32,13 +33,13 @@ protected LytRect computeLayout(LayoutContext context, int x, int y, int availab
int size = mergedIngredients.size();
if (size == 0) return null;
if (size == 1) {
- return new LytRect(x + 16, y + 16, ITEM_SIZE, ITEM_SIZE);
+ return new LytRect(x + 16, y + 16, SLOT_SIZE, SLOT_SIZE);
} else if (size <= 4) {
- return new LytRect(x + 8, y + 8, ITEM_SIZE * 2, ITEM_SIZE * 2);
+ return new LytRect(x + 16, y + 8, SLOT_SIZE * 2, SLOT_SIZE * 2);
} else if (size <= 6) {
- return new LytRect(x, y, ITEM_SIZE * 3, ITEM_SIZE * 2);
+ return new LytRect(x + 8, y + 8, SLOT_SIZE * 3, SLOT_SIZE * 2);
} else {
- return new LytRect(x, y, ITEM_SIZE * 3, ITEM_SIZE * (size / 3));
+ return new LytRect(x + 8, y + 4, SLOT_SIZE * 3, SLOT_SIZE * 3);
}
}
@@ -50,7 +51,7 @@ public void render(RenderContext context) {
int size = mergedIngredients.size();
if (size == 1) {
ItemIngredientPredicate ingredient = mergedIngredients.getFirst();
- LytRect lytRect = new LytRect(bounds.x(), bounds.y(), 18, 18);
+ LytRect lytRect = new LytRect(bounds.x(), bounds.y(), SLOT_SIZE, SLOT_SIZE);
context.renderItem(ingredient.getItems()[0], x + 1, y + 1, ITEM_SIZE, ITEM_SIZE);
context.fillIcon(lytRect, texture);
} else if (size <= 4) {
@@ -58,7 +59,7 @@ public void render(RenderContext context) {
int row = i / 2;
int col = i % 2;
ItemStack stack = getDisplayedStack(mergedIngredients.get(i).getItems());
- LytRect lytRect = new LytRect(bounds.x() + 18 * col, bounds.y() + 18 * row, 18, 18);
+ LytRect lytRect = new LytRect(bounds.x() + SLOT_SIZE * col, bounds.y() + SLOT_SIZE * row, SLOT_SIZE, SLOT_SIZE);
context.fillIcon(lytRect, texture);
context.renderItem(stack, lytRect.x() + 1, lytRect.y() + 1, ITEM_SIZE, ITEM_SIZE);
}
@@ -67,7 +68,7 @@ public void render(RenderContext context) {
int row = i / 3;
int col = i % 3;
ItemStack stack = getDisplayedStack(mergedIngredients.get(i).getItems());
- LytRect lytRect = new LytRect(bounds.x() + 18 * col, bounds.y() + 18 * row, 18, 18);
+ LytRect lytRect = new LytRect(bounds.x() + SLOT_SIZE * col, bounds.y() + SLOT_SIZE * row, SLOT_SIZE, SLOT_SIZE);
context.fillIcon(lytRect, texture);
context.renderItem(stack, lytRect.x() + 1, lytRect.y() + 1, ITEM_SIZE, ITEM_SIZE);
}
@@ -77,7 +78,7 @@ public void render(RenderContext context) {
int row = i / 3;
int col = i % 3;
ItemStack stack = getDisplayedStack(mergedIngredients.get(i).getItems());
- LytRect lytRect = new LytRect(bounds.x() + 18 * col, bounds.y() + 18 * row, 18, 18);
+ LytRect lytRect = new LytRect(bounds.x() + SLOT_SIZE * col, bounds.y() + SLOT_SIZE * row, SLOT_SIZE, SLOT_SIZE);
context.fillIcon(lytRect, texture);
context.renderItem(stack, lytRect.x() + 1, lytRect.y() + 1, ITEM_SIZE, ITEM_SIZE);
}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytOutputItemSlot.java b/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytOutputItemSlot.java
index 091cb50..5940efb 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytOutputItemSlot.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/slot/LytOutputItemSlot.java
@@ -18,6 +18,7 @@
public class LytOutputItemSlot extends LytBlock implements InteractiveElement {
private static final int ITEM_SIZE = 16;
+ private static final int SLOT_SIZE = 18;
private final List resultItems;
@@ -30,13 +31,13 @@ protected LytRect computeLayout(LayoutContext context, int x, int y, int availab
int size = resultItems.size();
if (size == 0) return null;
if (size == 1) {
- return new LytRect(x + 16, y + 16, ITEM_SIZE, ITEM_SIZE);
+ return new LytRect(x + 16, y + 16, SLOT_SIZE, SLOT_SIZE);
} else if (size <= 4) {
- return new LytRect(x + 8, y + 8, ITEM_SIZE * 2, ITEM_SIZE * 2);
+ return new LytRect(x + 16, y + 8, SLOT_SIZE * 2, SLOT_SIZE * 2);
} else if (size <= 6) {
- return new LytRect(x, y, ITEM_SIZE * 3, ITEM_SIZE * 2);
+ return new LytRect(x + 8, y + 8, SLOT_SIZE * 3, SLOT_SIZE * 2);
} else {
- return new LytRect(x, y, ITEM_SIZE * 3, ITEM_SIZE * (size / 3));
+ return new LytRect(x + 8, y + 4, SLOT_SIZE * 3, SLOT_SIZE * 3);
}
}
@@ -48,7 +49,7 @@ public void render(RenderContext context) {
int size = resultItems.size();
if (size == 1) {
ItemStack stack = resultItems.getFirst().stack();
- LytRect lytRect = new LytRect(bounds.x(), bounds.y(), 18, 18);
+ LytRect lytRect = new LytRect(bounds.x(), bounds.y(), SLOT_SIZE, SLOT_SIZE);
context.renderItem(stack, x + 1, y + 1, ITEM_SIZE, ITEM_SIZE);
context.fillIcon(lytRect, texture);
} else if (size <= 4) {
@@ -56,7 +57,7 @@ public void render(RenderContext context) {
int row = i / 2;
int col = i % 2;
ItemStack stack = resultItems.get(i).stack();
- LytRect lytRect = new LytRect(bounds.x() + 18 * col, bounds.y() + 18 * row, 18, 18);
+ LytRect lytRect = new LytRect(bounds.x() + SLOT_SIZE * col, bounds.y() + SLOT_SIZE * row, SLOT_SIZE, SLOT_SIZE);
context.fillIcon(lytRect, texture);
context.renderItem(stack, lytRect.x() + 1, lytRect.y() + 1, ITEM_SIZE, ITEM_SIZE);
}
@@ -65,7 +66,7 @@ public void render(RenderContext context) {
int row = i / 3;
int col = i % 3;
ItemStack stack = resultItems.get(i).stack();
- LytRect lytRect = new LytRect(bounds.x() + 18 * col, bounds.y() + 18 * row, 18, 18);
+ LytRect lytRect = new LytRect(bounds.x() + SLOT_SIZE * col, bounds.y() + SLOT_SIZE * row, SLOT_SIZE, SLOT_SIZE);
context.fillIcon(lytRect, texture);
context.renderItem(stack, lytRect.x() + 1, lytRect.y() + 1, ITEM_SIZE, ITEM_SIZE);
}
@@ -75,7 +76,7 @@ public void render(RenderContext context) {
int row = i / 3;
int col = i % 3;
ItemStack stack = resultItems.get(i).stack();
- LytRect lytRect = new LytRect(bounds.x() + 18 * col, bounds.y() + 18 * row, 18, 18);
+ LytRect lytRect = new LytRect(bounds.x() + SLOT_SIZE * col, bounds.y() + SLOT_SIZE * row, SLOT_SIZE, SLOT_SIZE);
context.fillIcon(lytRect, texture);
context.renderItem(stack, lytRect.x() + 1, lytRect.y() + 1, ITEM_SIZE, ITEM_SIZE);
}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/tooltip/ChanceItemTooltip.java b/src/main/java/dev/anvilcraft/guideme/recipe/tooltip/ChanceItemTooltip.java
index 731cf4e..6556c31 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/tooltip/ChanceItemTooltip.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/tooltip/ChanceItemTooltip.java
@@ -35,7 +35,8 @@ public ItemStack getIcon() {
@Override
public List getLines() {
- List list = new ArrayList<>();
+ List list = new ArrayList<>(Screen.getTooltipFromItem(Minecraft.getInstance(), chanceItemStack.stack()));
+
NumberProvider provider = chanceItemStack.count();
int count = chanceItemStack.stack().getCount();
@@ -58,8 +59,8 @@ public List getLines() {
}
}
- list.addAll(Screen.getTooltipFromItem(Minecraft.getInstance(), chanceItemStack.stack()));
- return list.stream()
+ return list
+ .stream()
.map(Component::getVisualOrderText)
.map(ClientTooltipComponent::create)
.toList();
diff --git a/src/main/java/dev/anvilcraft/guideme/util/GuideMERenderUtil.java b/src/main/java/dev/anvilcraft/guideme/util/GuideMERenderUtil.java
index 4e89890..f733fa0 100644
--- a/src/main/java/dev/anvilcraft/guideme/util/GuideMERenderUtil.java
+++ b/src/main/java/dev/anvilcraft/guideme/util/GuideMERenderUtil.java
@@ -50,26 +50,27 @@ public static void renderAnvil(
public static void renderedBlock(
GuiGraphics guiGraphics,
- List block,
+ List list,
int x,
- int y,
- int z
+ int y
) {
- if (block == null) return;
- int blockCount = block.size();
- int displayIndex = getDisplayPage(blockCount);
- if (displayIndex < 0 || displayIndex >= blockCount) return;
- BlockState renderedState = block.get(displayIndex);
- if (renderedState == null) return;
- RenderSupport.renderBlock(
- guiGraphics,
- renderedState,
- x,
- y,
- z,
- 12,
- RenderSupport.SINGLE_BLOCK
- );
+ int z = 25;
+ List list1 = new ArrayList<>(list);
+ for (int i = list1.size() - 1; i >= 0; i--) {
+ List input = list1.get(i).constructStatesForRender();
+ if (input.isEmpty()) continue;
+ BlockState renderedState = input.get((int) ((System.currentTimeMillis() / 1000) % input.size()));
+ if (renderedState == null) continue;
+ RenderSupport.renderBlock(
+ guiGraphics,
+ renderedState,
+ x,
+ y + 10 * i,
+ z - 10 * i,
+ 12,
+ RenderSupport.SINGLE_BLOCK
+ );
+ }
}
public static void renderedBlockStatesAndAnvilAnimation(
diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg
index 2b7dc05..3acef67 100644
--- a/src/main/resources/META-INF/accesstransformer.cfg
+++ b/src/main/resources/META-INF/accesstransformer.cfg
@@ -123,3 +123,12 @@ public net.minecraft.world.level.block.FallingBlock falling(Lnet/minecraft/world
public net.minecraft.world.entity.projectile.AbstractArrow piercingIgnoreEntityIds # piercingIgnoreEntityIds
public net.minecraft.world.entity.projectile.AbstractArrow life # life
+
+public net.minecraft.world.item.crafting.SmithingTransformRecipe template
+public net.minecraft.world.item.crafting.SmithingTransformRecipe base
+public net.minecraft.world.item.crafting.SmithingTransformRecipe addition
+public net.minecraft.world.item.crafting.SmithingTransformRecipe result
+
+public net.minecraft.world.item.crafting.SmithingTrimRecipe template
+public net.minecraft.world.item.crafting.SmithingTrimRecipe base
+public net.minecraft.world.item.crafting.SmithingTrimRecipe addition
\ No newline at end of file
From 0b68c12536f77917db2ca5b0e1189c2e462aadb8 Mon Sep 17 00:00:00 2001
From: theabab2333 <2047477146@qq.com>
Date: Sun, 21 Dec 2025 23:32:12 +0800
Subject: [PATCH 06/27] =?UTF-8?q?feat(recipe):=20=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E5=A4=9A=E7=A7=8D=E9=93=81=E7=A0=A7=E5=B7=A5=E8=89=BA=E9=85=8D?=
=?UTF-8?q?=E6=96=B9=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
WIP
- 新增基础多对一锻造配方布局类
- 添加充电器充能配方布局类
- 添加铁砧碰撞配方布局类
- 添加珠宝制作配方布局类
- 添加生物转换配方布局类
- 添加带物品生物转换配方布局类
- 添加中子辐照配方布局类
- 添加挤压配方布局类
- 添加冲压配方布局类
- 添加超级加热配方布局类
- 添加时间扭曲配方布局类
- 添加拆解配方布局类
- 在配方类型贡献中注册新配方类型映射
- 更新依赖版本:anvillib 和 anvilcraft
---
gradle/libs.versions.toml | 4 +-
.../recipe/RecipeTypeContributions.java | 180 ++++++++++++++++++
.../LytBaseMultipleToOneSmithingRecipe.java | 9 +
.../anvil/LytChargerChargingRecipe.java | 10 +
.../recipe/anvil/LytCollisionRecipe.java | 9 +
.../recipe/anvil/LytJewelCraftingRecipe.java | 9 +
.../recipe/anvil/LytMobTransformRecipe.java | 9 +
.../anvil/LytMobTransformWithItemRecipe.java | 9 +
.../anvil/LytNeutronIrradiationRecipe.java | 10 +
.../recipe/anvil/LytSqueezingRecipe.java | 9 +
.../recipe/anvil/LytStampingRecipe.java | 10 +
.../recipe/anvil/LytSuperHeatingRecipe.java | 10 +
.../recipe/anvil/LytTimeWarpRecipe.java | 9 +
.../guideme/recipe/anvil/LytUnpackRecipe.java | 9 +
14 files changed, 294 insertions(+), 2 deletions(-)
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBaseMultipleToOneSmithingRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytChargerChargingRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytCollisionRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytJewelCraftingRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMobTransformRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMobTransformWithItemRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytNeutronIrradiationRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytSqueezingRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytStampingRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytSuperHeatingRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytTimeWarpRecipe.java
create mode 100644 src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytUnpackRecipe.java
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 5b6b97e..0d73067 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -2,8 +2,8 @@
minecraft = "1.21.1"
neoForge = "21.1.152"
registrate = "MC1.21-1.3.0+62"
-anvillib = "1.4.0+build.160"
-anvilcraft = "1.5.0+pre-release.24"
+anvillib = "1.4.0+build.172"
+anvilcraft = "1.5.0+pre-release.29"
curios = "9.0.15+1.21.1"
jei = "19.21.0.247"
jade = "15.3.4+neoforge"
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/RecipeTypeContributions.java b/src/main/java/dev/anvilcraft/guideme/recipe/RecipeTypeContributions.java
index 56ad2e1..1c1cdfc 100644
--- a/src/main/java/dev/anvilcraft/guideme/recipe/RecipeTypeContributions.java
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/RecipeTypeContributions.java
@@ -1,19 +1,34 @@
package dev.anvilcraft.guideme.recipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytBaseMultipleToOneSmithingRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytBlockCompressRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytBlockCrushRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytBlockSmearRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytBoilingRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytBulgingRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytChargerChargingRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytCollisionRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytCookingRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytItemCompressRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytItemCrushRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytItemInjectRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytJewelCraftingRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytMassInjectRecipe;
import dev.anvilcraft.guideme.recipe.anvil.LytMeshRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytMobTransformRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytMobTransformWithItemRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytNeutronIrradiationRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytSqueezingRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytStampingRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytSuperHeatingRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytTimeWarpRecipe;
+import dev.anvilcraft.guideme.recipe.anvil.LytUnpackRecipe;
import dev.dubhe.anvilcraft.init.item.ModItems;
import dev.dubhe.anvilcraft.init.reicpe.ModRecipeTypes;
+import dev.dubhe.anvilcraft.recipe.ChargerChargingRecipe;
+import dev.dubhe.anvilcraft.recipe.JewelCraftingRecipe;
import dev.dubhe.anvilcraft.recipe.anvil.MassInjectRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.collision.AnvilCollisionCraftRecipe;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockCompressRecipe;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockCrushRecipe;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.BlockSmearRecipe;
@@ -24,6 +39,15 @@
import dev.dubhe.anvilcraft.recipe.anvil.wrap.ItemCrushRecipe;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.ItemInjectRecipe;
import dev.dubhe.anvilcraft.recipe.anvil.wrap.MeshRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.NeutronIrradiationRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.SqueezingRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.StampingRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.SuperHeatingRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.TimeWarpRecipe;
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.UnpackRecipe;
+import dev.dubhe.anvilcraft.recipe.multiple.BaseMultipleToOneSmithingRecipe;
+import dev.dubhe.anvilcraft.recipe.transform.MobTransformRecipe;
+import dev.dubhe.anvilcraft.recipe.transform.MobTransformWithItemRecipe;
import guideme.compiler.tags.RecipeTypeMappingSupplier;
import guideme.document.block.recipes.LytStandardRecipeBox;
import net.minecraft.world.item.Items;
@@ -31,6 +55,8 @@
public class RecipeTypeContributions implements RecipeTypeMappingSupplier {
+ // TODO: BeaconConversion | MultiBlock | EndPortalConversion | Transcendium
+
@Override
public void collect(RecipeTypeMappings mappings) {
mappings.add(ModRecipeTypes.BLOCK_COMPRESS_TYPE.get(), RecipeTypeContributions::blockCompress);
@@ -44,6 +70,7 @@ public void collect(RecipeTypeMappings mappings) {
mappings.add(ModRecipeTypes.ITEM_INJECT_TYPE.get(), RecipeTypeContributions::itemInject);
mappings.add(ModRecipeTypes.MASS_INJECT_TYPE.get(), RecipeTypeContributions::massInject);
mappings.add(ModRecipeTypes.MESH_TYPE.get(), RecipeTypeContributions::mesh);
+ mappings.add(ModRecipeTypes.NEUTRON_IRRADIATION.get(), RecipeTypeContributions::neutronIrradiation);
}
private static LytStandardRecipeBox blockCompress(RecipeHolder holder) {
@@ -211,4 +238,157 @@ private static LytStandardRecipeBox mesh(RecipeHolder ho
)
.build(holder);
}
+ private static LytStandardRecipeBox neutronIrradiation(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytNeutronIrradiationRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getResultItems()
+ .getFirst()
+ .getItem()
+ .getDescription()
+ .getString()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox squeezing(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytSqueezingRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getResultItems()
+ .getFirst()
+ .getItem()
+ .getDescription()
+ .getString()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox stamping(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytStampingRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getResultItems()
+ .getFirst()
+ .getItem()
+ .getDescription()
+ .getString()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox superHeating(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytSuperHeatingRecipe(holder.value()))
+ .build(holder);
+ }
+ private static LytStandardRecipeBox timeWarp(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytTimeWarpRecipe(holder.value()))
+ .build(holder);
+ }
+ private static LytStandardRecipeBox unpack(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytUnpackRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getResultItems()
+ .getFirst()
+ .getItem()
+ .getDescription()
+ .getString()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox collision(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytCollisionRecipe(holder.value()))
+ .build(holder);
+ }
+ private static LytStandardRecipeBox chargerCharging(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytChargerChargingRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getResult()
+ .getDescriptionId()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox jewelCrafting(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytJewelCraftingRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getResult()
+ .getDescriptionId()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox mobTransform(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytMobTransformRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .input()
+ .getDescription()
+ .getString()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox mobTransformWithItem(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytMobTransformWithItemRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .input()
+ .getDescription()
+ .getString()
+ )
+ .build(holder);
+ }
+ private static LytStandardRecipeBox multiple(RecipeHolder holder) {
+ return LytStandardRecipeBox
+ .builder()
+ .icon(Items.ANVIL)
+ .customBody(new LytBaseMultipleToOneSmithingRecipe(holder.value()))
+ .title(
+ holder
+ .value()
+ .getResult()
+ .getResult()
+ .getDescriptionId()
+ )
+ .build(holder);
+ }
}
\ No newline at end of file
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBaseMultipleToOneSmithingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBaseMultipleToOneSmithingRecipe.java
new file mode 100644
index 0000000..23c3aa2
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytBaseMultipleToOneSmithingRecipe.java
@@ -0,0 +1,9 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.dubhe.anvilcraft.recipe.multiple.BaseMultipleToOneSmithingRecipe;
+import guideme.document.block.LytVBox;
+
+public class LytBaseMultipleToOneSmithingRecipe extends LytVBox {
+ public LytBaseMultipleToOneSmithingRecipe(BaseMultipleToOneSmithingRecipe recipe) {
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytChargerChargingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytChargerChargingRecipe.java
new file mode 100644
index 0000000..a0a721f
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytChargerChargingRecipe.java
@@ -0,0 +1,10 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.dubhe.anvilcraft.recipe.ChargerChargingRecipe;
+import guideme.document.block.LytVBox;
+
+public class LytChargerChargingRecipe extends LytVBox {
+ public LytChargerChargingRecipe(ChargerChargingRecipe recipe) {
+
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytCollisionRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytCollisionRecipe.java
new file mode 100644
index 0000000..e748a84
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytCollisionRecipe.java
@@ -0,0 +1,9 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.dubhe.anvilcraft.recipe.anvil.collision.AnvilCollisionCraftRecipe;
+import guideme.document.block.LytVBox;
+
+public class LytCollisionRecipe extends LytVBox {
+ public LytCollisionRecipe(AnvilCollisionCraftRecipe recipe) {
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytJewelCraftingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytJewelCraftingRecipe.java
new file mode 100644
index 0000000..70c0e7b
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytJewelCraftingRecipe.java
@@ -0,0 +1,9 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.dubhe.anvilcraft.recipe.JewelCraftingRecipe;
+import guideme.document.block.LytVBox;
+
+public class LytJewelCraftingRecipe extends LytVBox {
+ public LytJewelCraftingRecipe(JewelCraftingRecipe recipe) {
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMobTransformRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMobTransformRecipe.java
new file mode 100644
index 0000000..4c95b1f
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMobTransformRecipe.java
@@ -0,0 +1,9 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.dubhe.anvilcraft.recipe.transform.MobTransformRecipe;
+import guideme.document.block.LytVBox;
+
+public class LytMobTransformRecipe extends LytVBox {
+ public LytMobTransformRecipe(MobTransformRecipe recipe) {
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMobTransformWithItemRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMobTransformWithItemRecipe.java
new file mode 100644
index 0000000..b9e6ef1
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytMobTransformWithItemRecipe.java
@@ -0,0 +1,9 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.dubhe.anvilcraft.recipe.transform.MobTransformWithItemRecipe;
+import guideme.document.block.LytVBox;
+
+public class LytMobTransformWithItemRecipe extends LytVBox {
+ public LytMobTransformWithItemRecipe(MobTransformWithItemRecipe recipe) {
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytNeutronIrradiationRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytNeutronIrradiationRecipe.java
new file mode 100644
index 0000000..c25b6ff
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytNeutronIrradiationRecipe.java
@@ -0,0 +1,10 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.NeutronIrradiationRecipe;
+import guideme.document.block.LytVBox;
+
+public class LytNeutronIrradiationRecipe extends LytVBox {
+ public LytNeutronIrradiationRecipe(NeutronIrradiationRecipe recipe) {
+
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytSqueezingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytSqueezingRecipe.java
new file mode 100644
index 0000000..fc5046d
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytSqueezingRecipe.java
@@ -0,0 +1,9 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.SqueezingRecipe;
+import guideme.document.block.LytVBox;
+
+public class LytSqueezingRecipe extends LytVBox {
+ public LytSqueezingRecipe(SqueezingRecipe recipe) {
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytStampingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytStampingRecipe.java
new file mode 100644
index 0000000..5f93f55
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytStampingRecipe.java
@@ -0,0 +1,10 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.StampingRecipe;
+import guideme.document.block.LytVBox;
+
+public class LytStampingRecipe extends LytVBox {
+ public LytStampingRecipe(StampingRecipe recipe) {
+
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytSuperHeatingRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytSuperHeatingRecipe.java
new file mode 100644
index 0000000..a3f0092
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytSuperHeatingRecipe.java
@@ -0,0 +1,10 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.SuperHeatingRecipe;
+import guideme.document.block.LytVBox;
+
+public class LytSuperHeatingRecipe extends LytVBox {
+ public LytSuperHeatingRecipe(SuperHeatingRecipe recipe) {
+
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytTimeWarpRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytTimeWarpRecipe.java
new file mode 100644
index 0000000..b82847d
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytTimeWarpRecipe.java
@@ -0,0 +1,9 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.TimeWarpRecipe;
+import guideme.document.block.LytVBox;
+
+public class LytTimeWarpRecipe extends LytVBox {
+ public LytTimeWarpRecipe(TimeWarpRecipe recipe) {
+ }
+}
diff --git a/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytUnpackRecipe.java b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytUnpackRecipe.java
new file mode 100644
index 0000000..701793c
--- /dev/null
+++ b/src/main/java/dev/anvilcraft/guideme/recipe/anvil/LytUnpackRecipe.java
@@ -0,0 +1,9 @@
+package dev.anvilcraft.guideme.recipe.anvil;
+
+import dev.dubhe.anvilcraft.recipe.anvil.wrap.UnpackRecipe;
+import guideme.document.block.LytVBox;
+
+public class LytUnpackRecipe extends LytVBox {
+ public LytUnpackRecipe(UnpackRecipe recipe) {
+ }
+}
From 2941f65848a6e3b44ce49fda05969e34d49a2543 Mon Sep 17 00:00:00 2001
From: theabab2333 <2047477146@qq.com>
Date: Mon, 22 Dec 2025 13:49:11 +0800
Subject: [PATCH 07/27] =?UTF-8?q?feat(recipe):=20=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E5=A4=9A=E7=A7=8D=E9=93=81=E7=A0=A7=E5=B7=A5=E8=89=BA=E9=85=8D?=
=?UTF-8?q?=E6=96=B9=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
WIP
- 新增基础多对一锻造配方布局类
- 添加充电器充能配方布局类
- 添加铁砧碰撞配方布局类
- 添加珠宝制作配方布局类
- 添加生物转换配方布局类
- 添加带物品生物转换配方布局类
- 添加中子辐照配方布局类
- 添加挤压配方布局类
- 添加冲压配方布局类
- 添加超级加热配方布局类
- 添加时间扭曲配方布局类
- 添加拆解配方布局类
- 在配方类型贡献中注册新配方类型映射
- 更新依赖版本:anvillib 和 anvilcraft
---
guidebook/index.md | 2 +-
.../recipe/RecipeTypeContributions.java | 11 +---
.../recipe/anvil/LytBulgingRecipe.java | 60 +++++++------------
.../anvil/LytNeutronIrradiationRecipe.java | 40 +++++++++++++
.../recipe/anvil/LytSqueezingRecipe.java | 43 +++++++++++++
.../recipe/anvil/LytStampingRecipe.java | 38 ++++++++++++
.../guideme/recipe/slot/LytBlockSlot.java | 22 +++++--
.../guideme/recipe/slot/LytInputItemSlot.java | 7 +--
.../recipe/slot/LytOutputItemSlot.java | 9 +--
.../guideme/util/BlockStateUtil.java | 15 +++++
10 files changed, 183 insertions(+), 64 deletions(-)
diff --git a/guidebook/index.md b/guidebook/index.md
index a01d196..ebe6b98 100644
--- a/guidebook/index.md
+++ b/guidebook/index.md
@@ -22,7 +22,7 @@ navigation:
* 压合:将两个方块压成一个
* 方块破坏:破坏切石机上的方块
-