File size: 172,922 Bytes
d46f4a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
package net.minecraft.data.recipes.packs;

import com.google.common.collect.ImmutableList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;
import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.advancements.critereon.InventoryChangeTrigger;
import net.minecraft.advancements.critereon.MinMaxBounds;
import net.minecraft.advancements.critereon.PlayerTrigger;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.PackOutput;
import net.minecraft.data.recipes.RecipeCategory;
import net.minecraft.data.recipes.RecipeOutput;
import net.minecraft.data.recipes.RecipeProvider;
import net.minecraft.data.recipes.SimpleCookingRecipeBuilder;
import net.minecraft.data.recipes.SingleItemRecipeBuilder;
import net.minecraft.data.recipes.SpecialRecipeBuilder;
import net.minecraft.data.recipes.TransmuteRecipeBuilder;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.flag.FeatureFlagSet;
import net.minecraft.world.flag.FeatureFlags;
import net.minecraft.world.item.BundleItem;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.DyeItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.ArmorDyeRecipe;
import net.minecraft.world.item.crafting.BannerDuplicateRecipe;
import net.minecraft.world.item.crafting.BookCloningRecipe;
import net.minecraft.world.item.crafting.CampfireCookingRecipe;
import net.minecraft.world.item.crafting.DecoratedPotRecipe;
import net.minecraft.world.item.crafting.FireworkRocketRecipe;
import net.minecraft.world.item.crafting.FireworkStarFadeRecipe;
import net.minecraft.world.item.crafting.FireworkStarRecipe;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.MapCloningRecipe;
import net.minecraft.world.item.crafting.MapExtendingRecipe;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RepairItemRecipe;
import net.minecraft.world.item.crafting.ShieldDecorationRecipe;
import net.minecraft.world.item.crafting.SmokingRecipe;
import net.minecraft.world.item.crafting.TippedArrowRecipe;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.ShulkerBoxBlock;
import net.minecraft.world.level.block.SuspiciousEffectHolder;

public class VanillaRecipeProvider extends RecipeProvider {
    private static final ImmutableList<ItemLike> COAL_SMELTABLES = ImmutableList.of(Items.COAL_ORE, Items.DEEPSLATE_COAL_ORE);
    private static final ImmutableList<ItemLike> IRON_SMELTABLES = ImmutableList.of(Items.IRON_ORE, Items.DEEPSLATE_IRON_ORE, Items.RAW_IRON);
    private static final ImmutableList<ItemLike> COPPER_SMELTABLES = ImmutableList.of(Items.COPPER_ORE, Items.DEEPSLATE_COPPER_ORE, Items.RAW_COPPER);
    private static final ImmutableList<ItemLike> GOLD_SMELTABLES = ImmutableList.of(Items.GOLD_ORE, Items.DEEPSLATE_GOLD_ORE, Items.NETHER_GOLD_ORE, Items.RAW_GOLD);
    private static final ImmutableList<ItemLike> DIAMOND_SMELTABLES = ImmutableList.of(Items.DIAMOND_ORE, Items.DEEPSLATE_DIAMOND_ORE);
    private static final ImmutableList<ItemLike> LAPIS_SMELTABLES = ImmutableList.of(Items.LAPIS_ORE, Items.DEEPSLATE_LAPIS_ORE);
    private static final ImmutableList<ItemLike> REDSTONE_SMELTABLES = ImmutableList.of(Items.REDSTONE_ORE, Items.DEEPSLATE_REDSTONE_ORE);
    private static final ImmutableList<ItemLike> EMERALD_SMELTABLES = ImmutableList.of(Items.EMERALD_ORE, Items.DEEPSLATE_EMERALD_ORE);

    VanillaRecipeProvider(HolderLookup.Provider p_362726_, RecipeOutput p_362384_) {
        super(p_362726_, p_362384_);
    }

    @Override
    protected void buildRecipes() {
        this.output.includeRootAdvancement();
        this.generateForEnabledBlockFamilies(FeatureFlagSet.of(FeatureFlags.VANILLA));
        this.planksFromLog(Blocks.ACACIA_PLANKS, ItemTags.ACACIA_LOGS, 4);
        this.planksFromLogs(Blocks.BIRCH_PLANKS, ItemTags.BIRCH_LOGS, 4);
        this.planksFromLogs(Blocks.CRIMSON_PLANKS, ItemTags.CRIMSON_STEMS, 4);
        this.planksFromLog(Blocks.DARK_OAK_PLANKS, ItemTags.DARK_OAK_LOGS, 4);
        this.planksFromLog(Blocks.PALE_OAK_PLANKS, ItemTags.PALE_OAK_LOGS, 4);
        this.planksFromLogs(Blocks.JUNGLE_PLANKS, ItemTags.JUNGLE_LOGS, 4);
        this.planksFromLogs(Blocks.OAK_PLANKS, ItemTags.OAK_LOGS, 4);
        this.planksFromLogs(Blocks.SPRUCE_PLANKS, ItemTags.SPRUCE_LOGS, 4);
        this.planksFromLogs(Blocks.WARPED_PLANKS, ItemTags.WARPED_STEMS, 4);
        this.planksFromLogs(Blocks.MANGROVE_PLANKS, ItemTags.MANGROVE_LOGS, 4);
        this.woodFromLogs(Blocks.ACACIA_WOOD, Blocks.ACACIA_LOG);
        this.woodFromLogs(Blocks.BIRCH_WOOD, Blocks.BIRCH_LOG);
        this.woodFromLogs(Blocks.DARK_OAK_WOOD, Blocks.DARK_OAK_LOG);
        this.woodFromLogs(Blocks.PALE_OAK_WOOD, Blocks.PALE_OAK_LOG);
        this.woodFromLogs(Blocks.JUNGLE_WOOD, Blocks.JUNGLE_LOG);
        this.woodFromLogs(Blocks.OAK_WOOD, Blocks.OAK_LOG);
        this.woodFromLogs(Blocks.SPRUCE_WOOD, Blocks.SPRUCE_LOG);
        this.woodFromLogs(Blocks.CRIMSON_HYPHAE, Blocks.CRIMSON_STEM);
        this.woodFromLogs(Blocks.WARPED_HYPHAE, Blocks.WARPED_STEM);
        this.woodFromLogs(Blocks.MANGROVE_WOOD, Blocks.MANGROVE_LOG);
        this.woodFromLogs(Blocks.STRIPPED_ACACIA_WOOD, Blocks.STRIPPED_ACACIA_LOG);
        this.woodFromLogs(Blocks.STRIPPED_BIRCH_WOOD, Blocks.STRIPPED_BIRCH_LOG);
        this.woodFromLogs(Blocks.STRIPPED_DARK_OAK_WOOD, Blocks.STRIPPED_DARK_OAK_LOG);
        this.woodFromLogs(Blocks.STRIPPED_PALE_OAK_WOOD, Blocks.STRIPPED_PALE_OAK_LOG);
        this.woodFromLogs(Blocks.STRIPPED_JUNGLE_WOOD, Blocks.STRIPPED_JUNGLE_LOG);
        this.woodFromLogs(Blocks.STRIPPED_OAK_WOOD, Blocks.STRIPPED_OAK_LOG);
        this.woodFromLogs(Blocks.STRIPPED_SPRUCE_WOOD, Blocks.STRIPPED_SPRUCE_LOG);
        this.woodFromLogs(Blocks.STRIPPED_CRIMSON_HYPHAE, Blocks.STRIPPED_CRIMSON_STEM);
        this.woodFromLogs(Blocks.STRIPPED_WARPED_HYPHAE, Blocks.STRIPPED_WARPED_STEM);
        this.woodFromLogs(Blocks.STRIPPED_MANGROVE_WOOD, Blocks.STRIPPED_MANGROVE_LOG);
        this.woodenBoat(Items.ACACIA_BOAT, Blocks.ACACIA_PLANKS);
        this.woodenBoat(Items.BIRCH_BOAT, Blocks.BIRCH_PLANKS);
        this.woodenBoat(Items.DARK_OAK_BOAT, Blocks.DARK_OAK_PLANKS);
        this.woodenBoat(Items.PALE_OAK_BOAT, Blocks.PALE_OAK_PLANKS);
        this.woodenBoat(Items.JUNGLE_BOAT, Blocks.JUNGLE_PLANKS);
        this.woodenBoat(Items.OAK_BOAT, Blocks.OAK_PLANKS);
        this.woodenBoat(Items.SPRUCE_BOAT, Blocks.SPRUCE_PLANKS);
        this.woodenBoat(Items.MANGROVE_BOAT, Blocks.MANGROVE_PLANKS);
        List<Item> list = List.of(
            Items.BLACK_DYE,
            Items.BLUE_DYE,
            Items.BROWN_DYE,
            Items.CYAN_DYE,
            Items.GRAY_DYE,
            Items.GREEN_DYE,
            Items.LIGHT_BLUE_DYE,
            Items.LIGHT_GRAY_DYE,
            Items.LIME_DYE,
            Items.MAGENTA_DYE,
            Items.ORANGE_DYE,
            Items.PINK_DYE,
            Items.PURPLE_DYE,
            Items.RED_DYE,
            Items.YELLOW_DYE,
            Items.WHITE_DYE
        );
        List<Item> list1 = List.of(
            Items.BLACK_WOOL,
            Items.BLUE_WOOL,
            Items.BROWN_WOOL,
            Items.CYAN_WOOL,
            Items.GRAY_WOOL,
            Items.GREEN_WOOL,
            Items.LIGHT_BLUE_WOOL,
            Items.LIGHT_GRAY_WOOL,
            Items.LIME_WOOL,
            Items.MAGENTA_WOOL,
            Items.ORANGE_WOOL,
            Items.PINK_WOOL,
            Items.PURPLE_WOOL,
            Items.RED_WOOL,
            Items.YELLOW_WOOL,
            Items.WHITE_WOOL
        );
        List<Item> list2 = List.of(
            Items.BLACK_BED,
            Items.BLUE_BED,
            Items.BROWN_BED,
            Items.CYAN_BED,
            Items.GRAY_BED,
            Items.GREEN_BED,
            Items.LIGHT_BLUE_BED,
            Items.LIGHT_GRAY_BED,
            Items.LIME_BED,
            Items.MAGENTA_BED,
            Items.ORANGE_BED,
            Items.PINK_BED,
            Items.PURPLE_BED,
            Items.RED_BED,
            Items.YELLOW_BED,
            Items.WHITE_BED
        );
        List<Item> list3 = List.of(
            Items.BLACK_CARPET,
            Items.BLUE_CARPET,
            Items.BROWN_CARPET,
            Items.CYAN_CARPET,
            Items.GRAY_CARPET,
            Items.GREEN_CARPET,
            Items.LIGHT_BLUE_CARPET,
            Items.LIGHT_GRAY_CARPET,
            Items.LIME_CARPET,
            Items.MAGENTA_CARPET,
            Items.ORANGE_CARPET,
            Items.PINK_CARPET,
            Items.PURPLE_CARPET,
            Items.RED_CARPET,
            Items.YELLOW_CARPET,
            Items.WHITE_CARPET
        );
        this.colorBlockWithDye(list, list1, "wool");
        this.colorBlockWithDye(list, list2, "bed");
        this.colorBlockWithDye(list, list3, "carpet");
        this.carpet(Blocks.BLACK_CARPET, Blocks.BLACK_WOOL);
        this.bedFromPlanksAndWool(Items.BLACK_BED, Blocks.BLACK_WOOL);
        this.banner(Items.BLACK_BANNER, Blocks.BLACK_WOOL);
        this.carpet(Blocks.BLUE_CARPET, Blocks.BLUE_WOOL);
        this.bedFromPlanksAndWool(Items.BLUE_BED, Blocks.BLUE_WOOL);
        this.banner(Items.BLUE_BANNER, Blocks.BLUE_WOOL);
        this.carpet(Blocks.BROWN_CARPET, Blocks.BROWN_WOOL);
        this.bedFromPlanksAndWool(Items.BROWN_BED, Blocks.BROWN_WOOL);
        this.banner(Items.BROWN_BANNER, Blocks.BROWN_WOOL);
        this.carpet(Blocks.CYAN_CARPET, Blocks.CYAN_WOOL);
        this.bedFromPlanksAndWool(Items.CYAN_BED, Blocks.CYAN_WOOL);
        this.banner(Items.CYAN_BANNER, Blocks.CYAN_WOOL);
        this.carpet(Blocks.GRAY_CARPET, Blocks.GRAY_WOOL);
        this.bedFromPlanksAndWool(Items.GRAY_BED, Blocks.GRAY_WOOL);
        this.banner(Items.GRAY_BANNER, Blocks.GRAY_WOOL);
        this.carpet(Blocks.GREEN_CARPET, Blocks.GREEN_WOOL);
        this.bedFromPlanksAndWool(Items.GREEN_BED, Blocks.GREEN_WOOL);
        this.banner(Items.GREEN_BANNER, Blocks.GREEN_WOOL);
        this.carpet(Blocks.LIGHT_BLUE_CARPET, Blocks.LIGHT_BLUE_WOOL);
        this.bedFromPlanksAndWool(Items.LIGHT_BLUE_BED, Blocks.LIGHT_BLUE_WOOL);
        this.banner(Items.LIGHT_BLUE_BANNER, Blocks.LIGHT_BLUE_WOOL);
        this.carpet(Blocks.LIGHT_GRAY_CARPET, Blocks.LIGHT_GRAY_WOOL);
        this.bedFromPlanksAndWool(Items.LIGHT_GRAY_BED, Blocks.LIGHT_GRAY_WOOL);
        this.banner(Items.LIGHT_GRAY_BANNER, Blocks.LIGHT_GRAY_WOOL);
        this.carpet(Blocks.LIME_CARPET, Blocks.LIME_WOOL);
        this.bedFromPlanksAndWool(Items.LIME_BED, Blocks.LIME_WOOL);
        this.banner(Items.LIME_BANNER, Blocks.LIME_WOOL);
        this.carpet(Blocks.MAGENTA_CARPET, Blocks.MAGENTA_WOOL);
        this.bedFromPlanksAndWool(Items.MAGENTA_BED, Blocks.MAGENTA_WOOL);
        this.banner(Items.MAGENTA_BANNER, Blocks.MAGENTA_WOOL);
        this.carpet(Blocks.ORANGE_CARPET, Blocks.ORANGE_WOOL);
        this.bedFromPlanksAndWool(Items.ORANGE_BED, Blocks.ORANGE_WOOL);
        this.banner(Items.ORANGE_BANNER, Blocks.ORANGE_WOOL);
        this.carpet(Blocks.PINK_CARPET, Blocks.PINK_WOOL);
        this.bedFromPlanksAndWool(Items.PINK_BED, Blocks.PINK_WOOL);
        this.banner(Items.PINK_BANNER, Blocks.PINK_WOOL);
        this.carpet(Blocks.PURPLE_CARPET, Blocks.PURPLE_WOOL);
        this.bedFromPlanksAndWool(Items.PURPLE_BED, Blocks.PURPLE_WOOL);
        this.banner(Items.PURPLE_BANNER, Blocks.PURPLE_WOOL);
        this.carpet(Blocks.RED_CARPET, Blocks.RED_WOOL);
        this.bedFromPlanksAndWool(Items.RED_BED, Blocks.RED_WOOL);
        this.banner(Items.RED_BANNER, Blocks.RED_WOOL);
        this.carpet(Blocks.WHITE_CARPET, Blocks.WHITE_WOOL);
        this.bedFromPlanksAndWool(Items.WHITE_BED, Blocks.WHITE_WOOL);
        this.banner(Items.WHITE_BANNER, Blocks.WHITE_WOOL);
        this.carpet(Blocks.YELLOW_CARPET, Blocks.YELLOW_WOOL);
        this.bedFromPlanksAndWool(Items.YELLOW_BED, Blocks.YELLOW_WOOL);
        this.banner(Items.YELLOW_BANNER, Blocks.YELLOW_WOOL);
        this.carpet(Blocks.MOSS_CARPET, Blocks.MOSS_BLOCK);
        this.carpet(Blocks.PALE_MOSS_CARPET, Blocks.PALE_MOSS_BLOCK);
        this.stainedGlassFromGlassAndDye(Blocks.BLACK_STAINED_GLASS, Items.BLACK_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.BLACK_STAINED_GLASS_PANE, Blocks.BLACK_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.BLACK_STAINED_GLASS_PANE, Items.BLACK_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.BLUE_STAINED_GLASS, Items.BLUE_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.BLUE_STAINED_GLASS_PANE, Blocks.BLUE_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.BLUE_STAINED_GLASS_PANE, Items.BLUE_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.BROWN_STAINED_GLASS, Items.BROWN_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.BROWN_STAINED_GLASS_PANE, Blocks.BROWN_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.BROWN_STAINED_GLASS_PANE, Items.BROWN_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.CYAN_STAINED_GLASS, Items.CYAN_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.CYAN_STAINED_GLASS_PANE, Blocks.CYAN_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.CYAN_STAINED_GLASS_PANE, Items.CYAN_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.GRAY_STAINED_GLASS, Items.GRAY_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.GRAY_STAINED_GLASS_PANE, Blocks.GRAY_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.GRAY_STAINED_GLASS_PANE, Items.GRAY_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.GREEN_STAINED_GLASS, Items.GREEN_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.GREEN_STAINED_GLASS_PANE, Blocks.GREEN_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.GREEN_STAINED_GLASS_PANE, Items.GREEN_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.LIGHT_BLUE_STAINED_GLASS, Items.LIGHT_BLUE_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.LIGHT_BLUE_STAINED_GLASS_PANE, Blocks.LIGHT_BLUE_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.LIGHT_BLUE_STAINED_GLASS_PANE, Items.LIGHT_BLUE_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.LIGHT_GRAY_STAINED_GLASS, Items.LIGHT_GRAY_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.LIGHT_GRAY_STAINED_GLASS_PANE, Blocks.LIGHT_GRAY_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.LIGHT_GRAY_STAINED_GLASS_PANE, Items.LIGHT_GRAY_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.LIME_STAINED_GLASS, Items.LIME_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.LIME_STAINED_GLASS_PANE, Blocks.LIME_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.LIME_STAINED_GLASS_PANE, Items.LIME_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.MAGENTA_STAINED_GLASS, Items.MAGENTA_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.MAGENTA_STAINED_GLASS_PANE, Blocks.MAGENTA_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.MAGENTA_STAINED_GLASS_PANE, Items.MAGENTA_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.ORANGE_STAINED_GLASS, Items.ORANGE_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.ORANGE_STAINED_GLASS_PANE, Blocks.ORANGE_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.ORANGE_STAINED_GLASS_PANE, Items.ORANGE_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.PINK_STAINED_GLASS, Items.PINK_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.PINK_STAINED_GLASS_PANE, Blocks.PINK_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.PINK_STAINED_GLASS_PANE, Items.PINK_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.PURPLE_STAINED_GLASS, Items.PURPLE_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.PURPLE_STAINED_GLASS_PANE, Blocks.PURPLE_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.PURPLE_STAINED_GLASS_PANE, Items.PURPLE_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.RED_STAINED_GLASS, Items.RED_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.RED_STAINED_GLASS_PANE, Blocks.RED_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.RED_STAINED_GLASS_PANE, Items.RED_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.WHITE_STAINED_GLASS, Items.WHITE_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.WHITE_STAINED_GLASS_PANE, Blocks.WHITE_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.WHITE_STAINED_GLASS_PANE, Items.WHITE_DYE);
        this.stainedGlassFromGlassAndDye(Blocks.YELLOW_STAINED_GLASS, Items.YELLOW_DYE);
        this.stainedGlassPaneFromStainedGlass(Blocks.YELLOW_STAINED_GLASS_PANE, Blocks.YELLOW_STAINED_GLASS);
        this.stainedGlassPaneFromGlassPaneAndDye(Blocks.YELLOW_STAINED_GLASS_PANE, Items.YELLOW_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.BLACK_TERRACOTTA, Items.BLACK_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.BLUE_TERRACOTTA, Items.BLUE_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.BROWN_TERRACOTTA, Items.BROWN_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.CYAN_TERRACOTTA, Items.CYAN_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.GRAY_TERRACOTTA, Items.GRAY_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.GREEN_TERRACOTTA, Items.GREEN_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.LIGHT_BLUE_TERRACOTTA, Items.LIGHT_BLUE_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.LIGHT_GRAY_TERRACOTTA, Items.LIGHT_GRAY_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.LIME_TERRACOTTA, Items.LIME_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.MAGENTA_TERRACOTTA, Items.MAGENTA_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.ORANGE_TERRACOTTA, Items.ORANGE_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.PINK_TERRACOTTA, Items.PINK_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.PURPLE_TERRACOTTA, Items.PURPLE_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.RED_TERRACOTTA, Items.RED_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.WHITE_TERRACOTTA, Items.WHITE_DYE);
        this.coloredTerracottaFromTerracottaAndDye(Blocks.YELLOW_TERRACOTTA, Items.YELLOW_DYE);
        this.concretePowder(Blocks.BLACK_CONCRETE_POWDER, Items.BLACK_DYE);
        this.concretePowder(Blocks.BLUE_CONCRETE_POWDER, Items.BLUE_DYE);
        this.concretePowder(Blocks.BROWN_CONCRETE_POWDER, Items.BROWN_DYE);
        this.concretePowder(Blocks.CYAN_CONCRETE_POWDER, Items.CYAN_DYE);
        this.concretePowder(Blocks.GRAY_CONCRETE_POWDER, Items.GRAY_DYE);
        this.concretePowder(Blocks.GREEN_CONCRETE_POWDER, Items.GREEN_DYE);
        this.concretePowder(Blocks.LIGHT_BLUE_CONCRETE_POWDER, Items.LIGHT_BLUE_DYE);
        this.concretePowder(Blocks.LIGHT_GRAY_CONCRETE_POWDER, Items.LIGHT_GRAY_DYE);
        this.concretePowder(Blocks.LIME_CONCRETE_POWDER, Items.LIME_DYE);
        this.concretePowder(Blocks.MAGENTA_CONCRETE_POWDER, Items.MAGENTA_DYE);
        this.concretePowder(Blocks.ORANGE_CONCRETE_POWDER, Items.ORANGE_DYE);
        this.concretePowder(Blocks.PINK_CONCRETE_POWDER, Items.PINK_DYE);
        this.concretePowder(Blocks.PURPLE_CONCRETE_POWDER, Items.PURPLE_DYE);
        this.concretePowder(Blocks.RED_CONCRETE_POWDER, Items.RED_DYE);
        this.concretePowder(Blocks.WHITE_CONCRETE_POWDER, Items.WHITE_DYE);
        this.concretePowder(Blocks.YELLOW_CONCRETE_POWDER, Items.YELLOW_DYE);
        this.shaped(RecipeCategory.DECORATIONS, Items.CANDLE)
            .define('S', Items.STRING)
            .define('H', Items.HONEYCOMB)
            .pattern("S")
            .pattern("H")
            .unlockedBy("has_string", this.has(Items.STRING))
            .unlockedBy("has_honeycomb", this.has(Items.HONEYCOMB))
            .save(this.output);
        this.candle(Blocks.BLACK_CANDLE, Items.BLACK_DYE);
        this.candle(Blocks.BLUE_CANDLE, Items.BLUE_DYE);
        this.candle(Blocks.BROWN_CANDLE, Items.BROWN_DYE);
        this.candle(Blocks.CYAN_CANDLE, Items.CYAN_DYE);
        this.candle(Blocks.GRAY_CANDLE, Items.GRAY_DYE);
        this.candle(Blocks.GREEN_CANDLE, Items.GREEN_DYE);
        this.candle(Blocks.LIGHT_BLUE_CANDLE, Items.LIGHT_BLUE_DYE);
        this.candle(Blocks.LIGHT_GRAY_CANDLE, Items.LIGHT_GRAY_DYE);
        this.candle(Blocks.LIME_CANDLE, Items.LIME_DYE);
        this.candle(Blocks.MAGENTA_CANDLE, Items.MAGENTA_DYE);
        this.candle(Blocks.ORANGE_CANDLE, Items.ORANGE_DYE);
        this.candle(Blocks.PINK_CANDLE, Items.PINK_DYE);
        this.candle(Blocks.PURPLE_CANDLE, Items.PURPLE_DYE);
        this.candle(Blocks.RED_CANDLE, Items.RED_DYE);
        this.candle(Blocks.WHITE_CANDLE, Items.WHITE_DYE);
        this.candle(Blocks.YELLOW_CANDLE, Items.YELLOW_DYE);
        this.shapeless(RecipeCategory.BUILDING_BLOCKS, Blocks.PACKED_MUD, 1)
            .requires(Blocks.MUD)
            .requires(Items.WHEAT)
            .unlockedBy("has_mud", this.has(Blocks.MUD))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.MUD_BRICKS, 4)
            .define('#', Blocks.PACKED_MUD)
            .pattern("##")
            .pattern("##")
            .unlockedBy("has_packed_mud", this.has(Blocks.PACKED_MUD))
            .save(this.output);
        this.shapeless(RecipeCategory.BUILDING_BLOCKS, Blocks.MUDDY_MANGROVE_ROOTS, 1)
            .requires(Blocks.MUD)
            .requires(Items.MANGROVE_ROOTS)
            .unlockedBy("has_mangrove_roots", this.has(Blocks.MANGROVE_ROOTS))
            .save(this.output);
        this.shaped(RecipeCategory.TRANSPORTATION, Blocks.ACTIVATOR_RAIL, 6)
            .define('#', Blocks.REDSTONE_TORCH)
            .define('S', Items.STICK)
            .define('X', Items.IRON_INGOT)
            .pattern("XSX")
            .pattern("X#X")
            .pattern("XSX")
            .unlockedBy("has_rail", this.has(Blocks.RAIL))
            .save(this.output);
        this.shapeless(RecipeCategory.BUILDING_BLOCKS, Blocks.ANDESITE, 2)
            .requires(Blocks.DIORITE)
            .requires(Blocks.COBBLESTONE)
            .unlockedBy("has_stone", this.has(Blocks.DIORITE))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.ANVIL)
            .define('I', Blocks.IRON_BLOCK)
            .define('i', Items.IRON_INGOT)
            .pattern("III")
            .pattern(" i ")
            .pattern("iii")
            .unlockedBy("has_iron_block", this.has(Blocks.IRON_BLOCK))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Items.ARMOR_STAND)
            .define('/', Items.STICK)
            .define('_', Blocks.SMOOTH_STONE_SLAB)
            .pattern("///")
            .pattern(" / ")
            .pattern("/_/")
            .unlockedBy("has_stone_slab", this.has(Blocks.SMOOTH_STONE_SLAB))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.ARROW, 4)
            .define('#', Items.STICK)
            .define('X', Items.FLINT)
            .define('Y', Items.FEATHER)
            .pattern("X")
            .pattern("#")
            .pattern("Y")
            .unlockedBy("has_feather", this.has(Items.FEATHER))
            .unlockedBy("has_flint", this.has(Items.FLINT))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.BARREL, 1)
            .define('P', ItemTags.PLANKS)
            .define('S', ItemTags.WOODEN_SLABS)
            .pattern("PSP")
            .pattern("P P")
            .pattern("PSP")
            .unlockedBy("has_planks", this.has(ItemTags.PLANKS))
            .unlockedBy("has_wood_slab", this.has(ItemTags.WOODEN_SLABS))
            .save(this.output);
        this.shaped(RecipeCategory.MISC, Blocks.BEACON)
            .define('S', Items.NETHER_STAR)
            .define('G', Blocks.GLASS)
            .define('O', Blocks.OBSIDIAN)
            .pattern("GGG")
            .pattern("GSG")
            .pattern("OOO")
            .unlockedBy("has_nether_star", this.has(Items.NETHER_STAR))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.BEEHIVE)
            .define('P', ItemTags.PLANKS)
            .define('H', Items.HONEYCOMB)
            .pattern("PPP")
            .pattern("HHH")
            .pattern("PPP")
            .unlockedBy("has_honeycomb", this.has(Items.HONEYCOMB))
            .save(this.output);
        this.shapeless(RecipeCategory.FOOD, Items.BEETROOT_SOUP)
            .requires(Items.BOWL)
            .requires(Items.BEETROOT, 6)
            .unlockedBy("has_beetroot", this.has(Items.BEETROOT))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.BLACK_DYE)
            .requires(Items.INK_SAC)
            .group("black_dye")
            .unlockedBy("has_ink_sac", this.has(Items.INK_SAC))
            .save(this.output);
        this.oneToOneConversionRecipe(Items.BLACK_DYE, Blocks.WITHER_ROSE, "black_dye");
        this.shapeless(RecipeCategory.BREWING, Items.BLAZE_POWDER, 2)
            .requires(Items.BLAZE_ROD)
            .unlockedBy("has_blaze_rod", this.has(Items.BLAZE_ROD))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.BLUE_DYE)
            .requires(Items.LAPIS_LAZULI)
            .group("blue_dye")
            .unlockedBy("has_lapis_lazuli", this.has(Items.LAPIS_LAZULI))
            .save(this.output);
        this.oneToOneConversionRecipe(Items.BLUE_DYE, Blocks.CORNFLOWER, "blue_dye");
        this.threeByThreePacker(RecipeCategory.BUILDING_BLOCKS, Blocks.BLUE_ICE, Blocks.PACKED_ICE);
        this.shapeless(RecipeCategory.MISC, Items.BONE_MEAL, 3)
            .requires(Items.BONE)
            .group("bonemeal")
            .unlockedBy("has_bone", this.has(Items.BONE))
            .save(this.output);
        this.nineBlockStorageRecipesRecipesWithCustomUnpacking(RecipeCategory.MISC, Items.BONE_MEAL, RecipeCategory.BUILDING_BLOCKS, Items.BONE_BLOCK, "bone_meal_from_bone_block", "bonemeal");
        this.shapeless(RecipeCategory.MISC, Items.BOOK)
            .requires(Items.PAPER, 3)
            .requires(Items.LEATHER)
            .unlockedBy("has_paper", this.has(Items.PAPER))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.BOOKSHELF)
            .define('#', ItemTags.PLANKS)
            .define('X', Items.BOOK)
            .pattern("###")
            .pattern("XXX")
            .pattern("###")
            .unlockedBy("has_book", this.has(Items.BOOK))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.BOW)
            .define('#', Items.STICK)
            .define('X', Items.STRING)
            .pattern(" #X")
            .pattern("# X")
            .pattern(" #X")
            .unlockedBy("has_string", this.has(Items.STRING))
            .save(this.output);
        this.shaped(RecipeCategory.MISC, Items.BOWL, 4)
            .define('#', ItemTags.PLANKS)
            .pattern("# #")
            .pattern(" # ")
            .unlockedBy("has_brown_mushroom", this.has(Blocks.BROWN_MUSHROOM))
            .unlockedBy("has_red_mushroom", this.has(Blocks.RED_MUSHROOM))
            .unlockedBy("has_mushroom_stew", this.has(Items.MUSHROOM_STEW))
            .save(this.output);
        this.shaped(RecipeCategory.FOOD, Items.BREAD)
            .define('#', Items.WHEAT)
            .pattern("###")
            .unlockedBy("has_wheat", this.has(Items.WHEAT))
            .save(this.output);
        this.shaped(RecipeCategory.BREWING, Blocks.BREWING_STAND)
            .define('B', Items.BLAZE_ROD)
            .define('#', ItemTags.STONE_CRAFTING_MATERIALS)
            .pattern(" B ")
            .pattern("###")
            .unlockedBy("has_blaze_rod", this.has(Items.BLAZE_ROD))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.BRICKS)
            .define('#', Items.BRICK)
            .pattern("##")
            .pattern("##")
            .unlockedBy("has_brick", this.has(Items.BRICK))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.BROWN_DYE)
            .requires(Items.COCOA_BEANS)
            .group("brown_dye")
            .unlockedBy("has_cocoa_beans", this.has(Items.COCOA_BEANS))
            .save(this.output);
        this.shaped(RecipeCategory.MISC, Items.BUCKET)
            .define('#', Items.IRON_INGOT)
            .pattern("# #")
            .pattern(" # ")
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.FOOD, Blocks.CAKE)
            .define('A', Items.MILK_BUCKET)
            .define('B', Items.SUGAR)
            .define('C', Items.WHEAT)
            .define('E', Items.EGG)
            .pattern("AAA")
            .pattern("BEB")
            .pattern("CCC")
            .unlockedBy("has_egg", this.has(Items.EGG))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.CAMPFIRE)
            .define('L', ItemTags.LOGS)
            .define('S', Items.STICK)
            .define('C', ItemTags.COALS)
            .pattern(" S ")
            .pattern("SCS")
            .pattern("LLL")
            .unlockedBy("has_stick", this.has(Items.STICK))
            .unlockedBy("has_coal", this.has(ItemTags.COALS))
            .save(this.output);
        this.shaped(RecipeCategory.TRANSPORTATION, Items.CARROT_ON_A_STICK)
            .define('#', Items.FISHING_ROD)
            .define('X', Items.CARROT)
            .pattern("# ")
            .pattern(" X")
            .unlockedBy("has_carrot", this.has(Items.CARROT))
            .save(this.output);
        this.shaped(RecipeCategory.TRANSPORTATION, Items.WARPED_FUNGUS_ON_A_STICK)
            .define('#', Items.FISHING_ROD)
            .define('X', Items.WARPED_FUNGUS)
            .pattern("# ")
            .pattern(" X")
            .unlockedBy("has_warped_fungus", this.has(Items.WARPED_FUNGUS))
            .save(this.output);
        this.shaped(RecipeCategory.BREWING, Blocks.CAULDRON)
            .define('#', Items.IRON_INGOT)
            .pattern("# #")
            .pattern("# #")
            .pattern("###")
            .unlockedBy("has_water_bucket", this.has(Items.WATER_BUCKET))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.COMPOSTER)
            .define('#', ItemTags.WOODEN_SLABS)
            .pattern("# #")
            .pattern("# #")
            .pattern("###")
            .unlockedBy("has_wood_slab", this.has(ItemTags.WOODEN_SLABS))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.CHEST)
            .define('#', ItemTags.PLANKS)
            .pattern("###")
            .pattern("# #")
            .pattern("###")
            .unlockedBy(
                "has_lots_of_items",
                CriteriaTriggers.INVENTORY_CHANGED
                    .createCriterion(
                        new InventoryChangeTrigger.TriggerInstance(
                            Optional.empty(),
                            new InventoryChangeTrigger.TriggerInstance.Slots(
                                MinMaxBounds.Ints.atLeast(10), MinMaxBounds.Ints.ANY, MinMaxBounds.Ints.ANY
                            ),
                            List.of()
                        )
                    )
            )
            .save(this.output);
        this.shapeless(RecipeCategory.TRANSPORTATION, Items.CHEST_MINECART)
            .requires(Blocks.CHEST)
            .requires(Items.MINECART)
            .unlockedBy("has_minecart", this.has(Items.MINECART))
            .save(this.output);
        this.chestBoat(Items.ACACIA_CHEST_BOAT, Items.ACACIA_BOAT);
        this.chestBoat(Items.BIRCH_CHEST_BOAT, Items.BIRCH_BOAT);
        this.chestBoat(Items.DARK_OAK_CHEST_BOAT, Items.DARK_OAK_BOAT);
        this.chestBoat(Items.PALE_OAK_CHEST_BOAT, Items.PALE_OAK_BOAT);
        this.chestBoat(Items.JUNGLE_CHEST_BOAT, Items.JUNGLE_BOAT);
        this.chestBoat(Items.OAK_CHEST_BOAT, Items.OAK_BOAT);
        this.chestBoat(Items.SPRUCE_CHEST_BOAT, Items.SPRUCE_BOAT);
        this.chestBoat(Items.MANGROVE_CHEST_BOAT, Items.MANGROVE_BOAT);
        this.chiseledBuilder(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_QUARTZ_BLOCK, Ingredient.of(Blocks.QUARTZ_SLAB))
            .unlockedBy("has_chiseled_quartz_block", this.has(Blocks.CHISELED_QUARTZ_BLOCK))
            .unlockedBy("has_quartz_block", this.has(Blocks.QUARTZ_BLOCK))
            .unlockedBy("has_quartz_pillar", this.has(Blocks.QUARTZ_PILLAR))
            .save(this.output);
        this.chiseledBuilder(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_STONE_BRICKS, Ingredient.of(Blocks.STONE_BRICK_SLAB))
            .unlockedBy("has_tag", this.has(ItemTags.STONE_BRICKS))
            .save(this.output);
        this.twoByTwoPacker(RecipeCategory.BUILDING_BLOCKS, Blocks.CLAY, Items.CLAY_BALL);
        this.shaped(RecipeCategory.TOOLS, Items.CLOCK)
            .define('#', Items.GOLD_INGOT)
            .define('X', Items.REDSTONE)
            .pattern(" # ")
            .pattern("#X#")
            .pattern(" # ")
            .unlockedBy("has_redstone", this.has(Items.REDSTONE))
            .save(this.output);
        this.nineBlockStorageRecipes(RecipeCategory.MISC, Items.COAL, RecipeCategory.BUILDING_BLOCKS, Items.COAL_BLOCK);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.COARSE_DIRT, 4)
            .define('D', Blocks.DIRT)
            .define('G', Blocks.GRAVEL)
            .pattern("DG")
            .pattern("GD")
            .unlockedBy("has_gravel", this.has(Blocks.GRAVEL))
            .save(this.output);
        this.shaped(RecipeCategory.REDSTONE, Blocks.COMPARATOR)
            .define('#', Blocks.REDSTONE_TORCH)
            .define('X', Items.QUARTZ)
            .define('I', Blocks.STONE)
            .pattern(" # ")
            .pattern("#X#")
            .pattern("III")
            .unlockedBy("has_quartz", this.has(Items.QUARTZ))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.COMPASS)
            .define('#', Items.IRON_INGOT)
            .define('X', Items.REDSTONE)
            .pattern(" # ")
            .pattern("#X#")
            .pattern(" # ")
            .unlockedBy("has_redstone", this.has(Items.REDSTONE))
            .save(this.output);
        this.shaped(RecipeCategory.FOOD, Items.COOKIE, 8)
            .define('#', Items.WHEAT)
            .define('X', Items.COCOA_BEANS)
            .pattern("#X#")
            .unlockedBy("has_cocoa", this.has(Items.COCOA_BEANS))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.CRAFTING_TABLE)
            .define('#', ItemTags.PLANKS)
            .pattern("##")
            .pattern("##")
            .unlockedBy("unlock_right_away", PlayerTrigger.TriggerInstance.tick())
            .showNotification(false)
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.CROSSBOW)
            .define('~', Items.STRING)
            .define('#', Items.STICK)
            .define('&', Items.IRON_INGOT)
            .define('$', Blocks.TRIPWIRE_HOOK)
            .pattern("#&#")
            .pattern("~$~")
            .pattern(" # ")
            .unlockedBy("has_string", this.has(Items.STRING))
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .unlockedBy("has_tripwire_hook", this.has(Blocks.TRIPWIRE_HOOK))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.LOOM)
            .define('#', ItemTags.PLANKS)
            .define('@', Items.STRING)
            .pattern("@@")
            .pattern("##")
            .unlockedBy("has_string", this.has(Items.STRING))
            .save(this.output);
        this.chiseledBuilder(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_RED_SANDSTONE, Ingredient.of(Blocks.RED_SANDSTONE_SLAB))
            .unlockedBy("has_red_sandstone", this.has(Blocks.RED_SANDSTONE))
            .unlockedBy("has_chiseled_red_sandstone", this.has(Blocks.CHISELED_RED_SANDSTONE))
            .unlockedBy("has_cut_red_sandstone", this.has(Blocks.CUT_RED_SANDSTONE))
            .save(this.output);
        this.chiseled(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_SANDSTONE, Blocks.SANDSTONE_SLAB);
        this.nineBlockStorageRecipesRecipesWithCustomUnpacking(
            RecipeCategory.MISC, Items.COPPER_INGOT, RecipeCategory.BUILDING_BLOCKS, Items.COPPER_BLOCK, getSimpleRecipeName(Items.COPPER_INGOT), getItemName(Items.COPPER_INGOT)
        );
        this.shapeless(RecipeCategory.MISC, Items.COPPER_INGOT, 9)
            .requires(Blocks.WAXED_COPPER_BLOCK)
            .group(getItemName(Items.COPPER_INGOT))
            .unlockedBy(getHasName(Blocks.WAXED_COPPER_BLOCK), this.has(Blocks.WAXED_COPPER_BLOCK))
            .save(this.output, getConversionRecipeName(Items.COPPER_INGOT, Blocks.WAXED_COPPER_BLOCK));
        this.waxRecipes(FeatureFlagSet.of(FeatureFlags.VANILLA));
        this.shapeless(RecipeCategory.MISC, Items.CYAN_DYE, 2)
            .requires(Items.BLUE_DYE)
            .requires(Items.GREEN_DYE)
            .group("cyan_dye")
            .unlockedBy("has_green_dye", this.has(Items.GREEN_DYE))
            .unlockedBy("has_blue_dye", this.has(Items.BLUE_DYE))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.DARK_PRISMARINE)
            .define('S', Items.PRISMARINE_SHARD)
            .define('I', Items.BLACK_DYE)
            .pattern("SSS")
            .pattern("SIS")
            .pattern("SSS")
            .unlockedBy("has_prismarine_shard", this.has(Items.PRISMARINE_SHARD))
            .save(this.output);
        this.shaped(RecipeCategory.REDSTONE, Blocks.DAYLIGHT_DETECTOR)
            .define('Q', Items.QUARTZ)
            .define('G', Blocks.GLASS)
            .define('W', ItemTags.WOODEN_SLABS)
            .pattern("GGG")
            .pattern("QQQ")
            .pattern("WWW")
            .unlockedBy("has_quartz", this.has(Items.QUARTZ))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_BRICKS, 4)
            .define('S', Blocks.POLISHED_DEEPSLATE)
            .pattern("SS")
            .pattern("SS")
            .unlockedBy("has_polished_deepslate", this.has(Blocks.POLISHED_DEEPSLATE))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_TILES, 4)
            .define('S', Blocks.DEEPSLATE_BRICKS)
            .pattern("SS")
            .pattern("SS")
            .unlockedBy("has_deepslate_bricks", this.has(Blocks.DEEPSLATE_BRICKS))
            .save(this.output);
        this.shaped(RecipeCategory.TRANSPORTATION, Blocks.DETECTOR_RAIL, 6)
            .define('R', Items.REDSTONE)
            .define('#', Blocks.STONE_PRESSURE_PLATE)
            .define('X', Items.IRON_INGOT)
            .pattern("X X")
            .pattern("X#X")
            .pattern("XRX")
            .unlockedBy("has_rail", this.has(Blocks.RAIL))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.DIAMOND_AXE)
            .define('#', Items.STICK)
            .define('X', ItemTags.DIAMOND_TOOL_MATERIALS)
            .pattern("XX")
            .pattern("X#")
            .pattern(" #")
            .unlockedBy("has_diamond", this.has(ItemTags.DIAMOND_TOOL_MATERIALS))
            .save(this.output);
        this.nineBlockStorageRecipes(RecipeCategory.MISC, Items.DIAMOND, RecipeCategory.BUILDING_BLOCKS, Items.DIAMOND_BLOCK);
        this.shaped(RecipeCategory.COMBAT, Items.DIAMOND_BOOTS)
            .define('X', Items.DIAMOND)
            .pattern("X X")
            .pattern("X X")
            .unlockedBy("has_diamond", this.has(Items.DIAMOND))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.DIAMOND_CHESTPLATE)
            .define('X', Items.DIAMOND)
            .pattern("X X")
            .pattern("XXX")
            .pattern("XXX")
            .unlockedBy("has_diamond", this.has(Items.DIAMOND))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.DIAMOND_HELMET)
            .define('X', Items.DIAMOND)
            .pattern("XXX")
            .pattern("X X")
            .unlockedBy("has_diamond", this.has(Items.DIAMOND))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.DIAMOND_HOE)
            .define('#', Items.STICK)
            .define('X', ItemTags.DIAMOND_TOOL_MATERIALS)
            .pattern("XX")
            .pattern(" #")
            .pattern(" #")
            .unlockedBy("has_diamond", this.has(ItemTags.DIAMOND_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.DIAMOND_LEGGINGS)
            .define('X', Items.DIAMOND)
            .pattern("XXX")
            .pattern("X X")
            .pattern("X X")
            .unlockedBy("has_diamond", this.has(Items.DIAMOND))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.DIAMOND_PICKAXE)
            .define('#', Items.STICK)
            .define('X', ItemTags.DIAMOND_TOOL_MATERIALS)
            .pattern("XXX")
            .pattern(" # ")
            .pattern(" # ")
            .unlockedBy("has_diamond", this.has(ItemTags.DIAMOND_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.DIAMOND_SHOVEL)
            .define('#', Items.STICK)
            .define('X', ItemTags.DIAMOND_TOOL_MATERIALS)
            .pattern("X")
            .pattern("#")
            .pattern("#")
            .unlockedBy("has_diamond", this.has(ItemTags.DIAMOND_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.DIAMOND_SWORD)
            .define('#', Items.STICK)
            .define('X', ItemTags.DIAMOND_TOOL_MATERIALS)
            .pattern("X")
            .pattern("X")
            .pattern("#")
            .unlockedBy("has_diamond", this.has(ItemTags.DIAMOND_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.DIORITE, 2)
            .define('Q', Items.QUARTZ)
            .define('C', Blocks.COBBLESTONE)
            .pattern("CQ")
            .pattern("QC")
            .unlockedBy("has_quartz", this.has(Items.QUARTZ))
            .save(this.output);
        this.shaped(RecipeCategory.REDSTONE, Blocks.DISPENSER)
            .define('R', Items.REDSTONE)
            .define('#', Blocks.COBBLESTONE)
            .define('X', Items.BOW)
            .pattern("###")
            .pattern("#X#")
            .pattern("#R#")
            .unlockedBy("has_bow", this.has(Items.BOW))
            .save(this.output);
        this.twoByTwoPacker(RecipeCategory.BUILDING_BLOCKS, Blocks.DRIPSTONE_BLOCK, Items.POINTED_DRIPSTONE);
        this.shaped(RecipeCategory.REDSTONE, Blocks.DROPPER)
            .define('R', Items.REDSTONE)
            .define('#', Blocks.COBBLESTONE)
            .pattern("###")
            .pattern("# #")
            .pattern("#R#")
            .unlockedBy("has_redstone", this.has(Items.REDSTONE))
            .save(this.output);
        this.nineBlockStorageRecipes(RecipeCategory.MISC, Items.EMERALD, RecipeCategory.BUILDING_BLOCKS, Items.EMERALD_BLOCK);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.ENCHANTING_TABLE)
            .define('B', Items.BOOK)
            .define('#', Blocks.OBSIDIAN)
            .define('D', Items.DIAMOND)
            .pattern(" B ")
            .pattern("D#D")
            .pattern("###")
            .unlockedBy("has_obsidian", this.has(Blocks.OBSIDIAN))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.ENDER_CHEST)
            .define('#', Blocks.OBSIDIAN)
            .define('E', Items.ENDER_EYE)
            .pattern("###")
            .pattern("#E#")
            .pattern("###")
            .unlockedBy("has_ender_eye", this.has(Items.ENDER_EYE))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.ENDER_EYE)
            .requires(Items.ENDER_PEARL)
            .requires(Items.BLAZE_POWDER)
            .unlockedBy("has_blaze_powder", this.has(Items.BLAZE_POWDER))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.END_STONE_BRICKS, 4)
            .define('#', Blocks.END_STONE)
            .pattern("##")
            .pattern("##")
            .unlockedBy("has_end_stone", this.has(Blocks.END_STONE))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Items.END_CRYSTAL)
            .define('T', Items.GHAST_TEAR)
            .define('E', Items.ENDER_EYE)
            .define('G', Blocks.GLASS)
            .pattern("GGG")
            .pattern("GEG")
            .pattern("GTG")
            .unlockedBy("has_ender_eye", this.has(Items.ENDER_EYE))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.END_ROD, 4)
            .define('#', Items.POPPED_CHORUS_FRUIT)
            .define('/', Items.BLAZE_ROD)
            .pattern("/")
            .pattern("#")
            .unlockedBy("has_chorus_fruit_popped", this.has(Items.POPPED_CHORUS_FRUIT))
            .save(this.output);
        this.shapeless(RecipeCategory.BREWING, Items.FERMENTED_SPIDER_EYE)
            .requires(Items.SPIDER_EYE)
            .requires(Blocks.BROWN_MUSHROOM)
            .requires(Items.SUGAR)
            .unlockedBy("has_spider_eye", this.has(Items.SPIDER_EYE))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.FIRE_CHARGE, 3)
            .requires(Items.GUNPOWDER)
            .requires(Items.BLAZE_POWDER)
            .requires(Ingredient.of(Items.COAL, Items.CHARCOAL))
            .unlockedBy("has_blaze_powder", this.has(Items.BLAZE_POWDER))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.FIREWORK_ROCKET, 3)
            .requires(Items.GUNPOWDER)
            .requires(Items.PAPER)
            .unlockedBy("has_gunpowder", this.has(Items.GUNPOWDER))
            .save(this.output, "firework_rocket_simple");
        this.shaped(RecipeCategory.TOOLS, Items.FISHING_ROD)
            .define('#', Items.STICK)
            .define('X', Items.STRING)
            .pattern("  #")
            .pattern(" #X")
            .pattern("# X")
            .unlockedBy("has_string", this.has(Items.STRING))
            .save(this.output);
        this.shapeless(RecipeCategory.TOOLS, Items.FLINT_AND_STEEL)
            .requires(Items.IRON_INGOT)
            .requires(Items.FLINT)
            .unlockedBy("has_flint", this.has(Items.FLINT))
            .unlockedBy("has_obsidian", this.has(Blocks.OBSIDIAN))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.FLOWER_POT)
            .define('#', Items.BRICK)
            .pattern("# #")
            .pattern(" # ")
            .unlockedBy("has_brick", this.has(Items.BRICK))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.FURNACE)
            .define('#', ItemTags.STONE_CRAFTING_MATERIALS)
            .pattern("###")
            .pattern("# #")
            .pattern("###")
            .unlockedBy("has_cobblestone", this.has(ItemTags.STONE_CRAFTING_MATERIALS))
            .save(this.output);
        this.shapeless(RecipeCategory.TRANSPORTATION, Items.FURNACE_MINECART)
            .requires(Blocks.FURNACE)
            .requires(Items.MINECART)
            .unlockedBy("has_minecart", this.has(Items.MINECART))
            .save(this.output);
        this.shaped(RecipeCategory.BREWING, Items.GLASS_BOTTLE, 3)
            .define('#', Blocks.GLASS)
            .pattern("# #")
            .pattern(" # ")
            .unlockedBy("has_glass", this.has(Blocks.GLASS))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.GLASS_PANE, 16)
            .define('#', Blocks.GLASS)
            .pattern("###")
            .pattern("###")
            .unlockedBy("has_glass", this.has(Blocks.GLASS))
            .save(this.output);
        this.twoByTwoPacker(RecipeCategory.BUILDING_BLOCKS, Blocks.GLOWSTONE, Items.GLOWSTONE_DUST);
        this.shapeless(RecipeCategory.DECORATIONS, Items.GLOW_ITEM_FRAME)
            .requires(Items.ITEM_FRAME)
            .requires(Items.GLOW_INK_SAC)
            .unlockedBy("has_item_frame", this.has(Items.ITEM_FRAME))
            .unlockedBy("has_glow_ink_sac", this.has(Items.GLOW_INK_SAC))
            .save(this.output);
        this.shaped(RecipeCategory.FOOD, Items.GOLDEN_APPLE)
            .define('#', Items.GOLD_INGOT)
            .define('X', Items.APPLE)
            .pattern("###")
            .pattern("#X#")
            .pattern("###")
            .unlockedBy("has_gold_ingot", this.has(Items.GOLD_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.GOLDEN_AXE)
            .define('#', Items.STICK)
            .define('X', ItemTags.GOLD_TOOL_MATERIALS)
            .pattern("XX")
            .pattern("X#")
            .pattern(" #")
            .unlockedBy("has_gold_ingot", this.has(ItemTags.GOLD_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.GOLDEN_BOOTS)
            .define('X', Items.GOLD_INGOT)
            .pattern("X X")
            .pattern("X X")
            .unlockedBy("has_gold_ingot", this.has(Items.GOLD_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.BREWING, Items.GOLDEN_CARROT)
            .define('#', Items.GOLD_NUGGET)
            .define('X', Items.CARROT)
            .pattern("###")
            .pattern("#X#")
            .pattern("###")
            .unlockedBy("has_gold_nugget", this.has(Items.GOLD_NUGGET))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.GOLDEN_CHESTPLATE)
            .define('X', Items.GOLD_INGOT)
            .pattern("X X")
            .pattern("XXX")
            .pattern("XXX")
            .unlockedBy("has_gold_ingot", this.has(Items.GOLD_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.GOLDEN_HELMET)
            .define('X', Items.GOLD_INGOT)
            .pattern("XXX")
            .pattern("X X")
            .unlockedBy("has_gold_ingot", this.has(Items.GOLD_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.GOLDEN_HOE)
            .define('#', Items.STICK)
            .define('X', ItemTags.GOLD_TOOL_MATERIALS)
            .pattern("XX")
            .pattern(" #")
            .pattern(" #")
            .unlockedBy("has_gold_ingot", this.has(ItemTags.GOLD_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.GOLDEN_LEGGINGS)
            .define('X', Items.GOLD_INGOT)
            .pattern("XXX")
            .pattern("X X")
            .pattern("X X")
            .unlockedBy("has_gold_ingot", this.has(Items.GOLD_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.GOLDEN_PICKAXE)
            .define('#', Items.STICK)
            .define('X', ItemTags.GOLD_TOOL_MATERIALS)
            .pattern("XXX")
            .pattern(" # ")
            .pattern(" # ")
            .unlockedBy("has_gold_ingot", this.has(ItemTags.GOLD_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.TRANSPORTATION, Blocks.POWERED_RAIL, 6)
            .define('R', Items.REDSTONE)
            .define('#', Items.STICK)
            .define('X', Items.GOLD_INGOT)
            .pattern("X X")
            .pattern("X#X")
            .pattern("XRX")
            .unlockedBy("has_rail", this.has(Blocks.RAIL))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.GOLDEN_SHOVEL)
            .define('#', Items.STICK)
            .define('X', ItemTags.GOLD_TOOL_MATERIALS)
            .pattern("X")
            .pattern("#")
            .pattern("#")
            .unlockedBy("has_gold_ingot", this.has(ItemTags.GOLD_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.GOLDEN_SWORD)
            .define('#', Items.STICK)
            .define('X', ItemTags.GOLD_TOOL_MATERIALS)
            .pattern("X")
            .pattern("X")
            .pattern("#")
            .unlockedBy("has_gold_ingot", this.has(ItemTags.GOLD_TOOL_MATERIALS))
            .save(this.output);
        this.nineBlockStorageRecipesRecipesWithCustomUnpacking(RecipeCategory.MISC, Items.GOLD_INGOT, RecipeCategory.BUILDING_BLOCKS, Items.GOLD_BLOCK, "gold_ingot_from_gold_block", "gold_ingot");
        this.nineBlockStorageRecipesWithCustomPacking(RecipeCategory.MISC, Items.GOLD_NUGGET, RecipeCategory.MISC, Items.GOLD_INGOT, "gold_ingot_from_nuggets", "gold_ingot");
        this.shapeless(RecipeCategory.BUILDING_BLOCKS, Blocks.GRANITE)
            .requires(Blocks.DIORITE)
            .requires(Items.QUARTZ)
            .unlockedBy("has_quartz", this.has(Items.QUARTZ))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.GRAY_DYE, 2)
            .requires(Items.BLACK_DYE)
            .requires(Items.WHITE_DYE)
            .unlockedBy("has_white_dye", this.has(Items.WHITE_DYE))
            .unlockedBy("has_black_dye", this.has(Items.BLACK_DYE))
            .save(this.output);
        this.threeByThreePacker(RecipeCategory.BUILDING_BLOCKS, Blocks.HAY_BLOCK, Items.WHEAT);
        this.pressurePlate(Blocks.HEAVY_WEIGHTED_PRESSURE_PLATE, Items.IRON_INGOT);
        this.shapeless(RecipeCategory.FOOD, Items.HONEY_BOTTLE, 4)
            .requires(Items.HONEY_BLOCK)
            .requires(Items.GLASS_BOTTLE, 4)
            .unlockedBy("has_honey_block", this.has(Blocks.HONEY_BLOCK))
            .save(this.output);
        this.twoByTwoPacker(RecipeCategory.REDSTONE, Blocks.HONEY_BLOCK, Items.HONEY_BOTTLE);
        this.twoByTwoPacker(RecipeCategory.DECORATIONS, Blocks.HONEYCOMB_BLOCK, Items.HONEYCOMB);
        this.shaped(RecipeCategory.REDSTONE, Blocks.HOPPER)
            .define('C', Blocks.CHEST)
            .define('I', Items.IRON_INGOT)
            .pattern("I I")
            .pattern("ICI")
            .pattern(" I ")
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.shapeless(RecipeCategory.TRANSPORTATION, Items.HOPPER_MINECART)
            .requires(Blocks.HOPPER)
            .requires(Items.MINECART)
            .unlockedBy("has_minecart", this.has(Items.MINECART))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.IRON_AXE)
            .define('#', Items.STICK)
            .define('X', ItemTags.IRON_TOOL_MATERIALS)
            .pattern("XX")
            .pattern("X#")
            .pattern(" #")
            .unlockedBy("has_iron_ingot", this.has(ItemTags.IRON_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.IRON_BARS, 16)
            .define('#', Items.IRON_INGOT)
            .pattern("###")
            .pattern("###")
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.IRON_BOOTS)
            .define('X', Items.IRON_INGOT)
            .pattern("X X")
            .pattern("X X")
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.IRON_CHESTPLATE)
            .define('X', Items.IRON_INGOT)
            .pattern("X X")
            .pattern("XXX")
            .pattern("XXX")
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.doorBuilder(Blocks.IRON_DOOR, Ingredient.of(Items.IRON_INGOT))
            .unlockedBy(getHasName(Items.IRON_INGOT), this.has(Items.IRON_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.IRON_HELMET)
            .define('X', Items.IRON_INGOT)
            .pattern("XXX")
            .pattern("X X")
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.IRON_HOE)
            .define('#', Items.STICK)
            .define('X', ItemTags.IRON_TOOL_MATERIALS)
            .pattern("XX")
            .pattern(" #")
            .pattern(" #")
            .unlockedBy("has_iron_ingot", this.has(ItemTags.IRON_TOOL_MATERIALS))
            .save(this.output);
        this.nineBlockStorageRecipesRecipesWithCustomUnpacking(RecipeCategory.MISC, Items.IRON_INGOT, RecipeCategory.BUILDING_BLOCKS, Items.IRON_BLOCK, "iron_ingot_from_iron_block", "iron_ingot");
        this.nineBlockStorageRecipesWithCustomPacking(RecipeCategory.MISC, Items.IRON_NUGGET, RecipeCategory.MISC, Items.IRON_INGOT, "iron_ingot_from_nuggets", "iron_ingot");
        this.shaped(RecipeCategory.COMBAT, Items.IRON_LEGGINGS)
            .define('X', Items.IRON_INGOT)
            .pattern("XXX")
            .pattern("X X")
            .pattern("X X")
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.IRON_PICKAXE)
            .define('#', Items.STICK)
            .define('X', ItemTags.IRON_TOOL_MATERIALS)
            .pattern("XXX")
            .pattern(" # ")
            .pattern(" # ")
            .unlockedBy("has_iron_ingot", this.has(ItemTags.IRON_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.IRON_SHOVEL)
            .define('#', Items.STICK)
            .define('X', ItemTags.IRON_TOOL_MATERIALS)
            .pattern("X")
            .pattern("#")
            .pattern("#")
            .unlockedBy("has_iron_ingot", this.has(ItemTags.IRON_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.IRON_SWORD)
            .define('#', Items.STICK)
            .define('X', ItemTags.IRON_TOOL_MATERIALS)
            .pattern("X")
            .pattern("X")
            .pattern("#")
            .unlockedBy("has_iron_ingot", this.has(ItemTags.IRON_TOOL_MATERIALS))
            .save(this.output);
        this.twoByTwoPacker(RecipeCategory.REDSTONE, Blocks.IRON_TRAPDOOR, Items.IRON_INGOT);
        this.shaped(RecipeCategory.DECORATIONS, Items.ITEM_FRAME)
            .define('#', Items.STICK)
            .define('X', Items.LEATHER)
            .pattern("###")
            .pattern("#X#")
            .pattern("###")
            .unlockedBy("has_leather", this.has(Items.LEATHER))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.JUKEBOX)
            .define('#', ItemTags.PLANKS)
            .define('X', Items.DIAMOND)
            .pattern("###")
            .pattern("#X#")
            .pattern("###")
            .unlockedBy("has_diamond", this.has(Items.DIAMOND))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.LADDER, 3)
            .define('#', Items.STICK)
            .pattern("# #")
            .pattern("###")
            .pattern("# #")
            .unlockedBy("has_stick", this.has(Items.STICK))
            .save(this.output);
        this.nineBlockStorageRecipes(RecipeCategory.MISC, Items.LAPIS_LAZULI, RecipeCategory.BUILDING_BLOCKS, Items.LAPIS_BLOCK);
        this.shaped(RecipeCategory.TOOLS, Items.LEAD, 2)
            .define('~', Items.STRING)
            .define('O', Items.SLIME_BALL)
            .pattern("~~ ")
            .pattern("~O ")
            .pattern("  ~")
            .unlockedBy("has_slime_ball", this.has(Items.SLIME_BALL))
            .save(this.output);
        this.twoByTwoPacker(RecipeCategory.MISC, Items.LEATHER, Items.RABBIT_HIDE);
        this.shaped(RecipeCategory.COMBAT, Items.LEATHER_BOOTS)
            .define('X', Items.LEATHER)
            .pattern("X X")
            .pattern("X X")
            .unlockedBy("has_leather", this.has(Items.LEATHER))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.LEATHER_CHESTPLATE)
            .define('X', Items.LEATHER)
            .pattern("X X")
            .pattern("XXX")
            .pattern("XXX")
            .unlockedBy("has_leather", this.has(Items.LEATHER))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.LEATHER_HELMET)
            .define('X', Items.LEATHER)
            .pattern("XXX")
            .pattern("X X")
            .unlockedBy("has_leather", this.has(Items.LEATHER))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.LEATHER_LEGGINGS)
            .define('X', Items.LEATHER)
            .pattern("XXX")
            .pattern("X X")
            .pattern("X X")
            .unlockedBy("has_leather", this.has(Items.LEATHER))
            .save(this.output);
        this.shaped(RecipeCategory.MISC, Items.LEATHER_HORSE_ARMOR)
            .define('X', Items.LEATHER)
            .pattern("X X")
            .pattern("XXX")
            .pattern("X X")
            .unlockedBy("has_leather", this.has(Items.LEATHER))
            .save(this.output);
        this.shaped(RecipeCategory.REDSTONE, Blocks.LECTERN)
            .define('S', ItemTags.WOODEN_SLABS)
            .define('B', Blocks.BOOKSHELF)
            .pattern("SSS")
            .pattern(" B ")
            .pattern(" S ")
            .unlockedBy("has_book", this.has(Items.BOOK))
            .save(this.output);
        this.shaped(RecipeCategory.REDSTONE, Blocks.LEVER)
            .define('#', Blocks.COBBLESTONE)
            .define('X', Items.STICK)
            .pattern("X")
            .pattern("#")
            .unlockedBy("has_cobblestone", this.has(Blocks.COBBLESTONE))
            .save(this.output);
        this.oneToOneConversionRecipe(Items.LIGHT_BLUE_DYE, Blocks.BLUE_ORCHID, "light_blue_dye");
        this.shapeless(RecipeCategory.MISC, Items.LIGHT_BLUE_DYE, 2)
            .requires(Items.BLUE_DYE)
            .requires(Items.WHITE_DYE)
            .group("light_blue_dye")
            .unlockedBy("has_blue_dye", this.has(Items.BLUE_DYE))
            .unlockedBy("has_white_dye", this.has(Items.WHITE_DYE))
            .save(this.output, "light_blue_dye_from_blue_white_dye");
        this.oneToOneConversionRecipe(Items.LIGHT_GRAY_DYE, Blocks.AZURE_BLUET, "light_gray_dye");
        this.shapeless(RecipeCategory.MISC, Items.LIGHT_GRAY_DYE, 2)
            .requires(Items.GRAY_DYE)
            .requires(Items.WHITE_DYE)
            .group("light_gray_dye")
            .unlockedBy("has_gray_dye", this.has(Items.GRAY_DYE))
            .unlockedBy("has_white_dye", this.has(Items.WHITE_DYE))
            .save(this.output, "light_gray_dye_from_gray_white_dye");
        this.shapeless(RecipeCategory.MISC, Items.LIGHT_GRAY_DYE, 3)
            .requires(Items.BLACK_DYE)
            .requires(Items.WHITE_DYE, 2)
            .group("light_gray_dye")
            .unlockedBy("has_white_dye", this.has(Items.WHITE_DYE))
            .unlockedBy("has_black_dye", this.has(Items.BLACK_DYE))
            .save(this.output, "light_gray_dye_from_black_white_dye");
        this.oneToOneConversionRecipe(Items.LIGHT_GRAY_DYE, Blocks.OXEYE_DAISY, "light_gray_dye");
        this.oneToOneConversionRecipe(Items.LIGHT_GRAY_DYE, Blocks.WHITE_TULIP, "light_gray_dye");
        this.pressurePlate(Blocks.LIGHT_WEIGHTED_PRESSURE_PLATE, Items.GOLD_INGOT);
        this.shaped(RecipeCategory.REDSTONE, Blocks.LIGHTNING_ROD)
            .define('#', Items.COPPER_INGOT)
            .pattern("#")
            .pattern("#")
            .pattern("#")
            .unlockedBy("has_copper_ingot", this.has(Items.COPPER_INGOT))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.LIME_DYE, 2)
            .requires(Items.GREEN_DYE)
            .requires(Items.WHITE_DYE)
            .unlockedBy("has_green_dye", this.has(Items.GREEN_DYE))
            .unlockedBy("has_white_dye", this.has(Items.WHITE_DYE))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.JACK_O_LANTERN)
            .define('A', Blocks.CARVED_PUMPKIN)
            .define('B', Blocks.TORCH)
            .pattern("A")
            .pattern("B")
            .unlockedBy("has_carved_pumpkin", this.has(Blocks.CARVED_PUMPKIN))
            .save(this.output);
        this.oneToOneConversionRecipe(Items.MAGENTA_DYE, Blocks.ALLIUM, "magenta_dye");
        this.shapeless(RecipeCategory.MISC, Items.MAGENTA_DYE, 4)
            .requires(Items.BLUE_DYE)
            .requires(Items.RED_DYE, 2)
            .requires(Items.WHITE_DYE)
            .group("magenta_dye")
            .unlockedBy("has_blue_dye", this.has(Items.BLUE_DYE))
            .unlockedBy("has_rose_red", this.has(Items.RED_DYE))
            .unlockedBy("has_white_dye", this.has(Items.WHITE_DYE))
            .save(this.output, "magenta_dye_from_blue_red_white_dye");
        this.shapeless(RecipeCategory.MISC, Items.MAGENTA_DYE, 3)
            .requires(Items.BLUE_DYE)
            .requires(Items.RED_DYE)
            .requires(Items.PINK_DYE)
            .group("magenta_dye")
            .unlockedBy("has_pink_dye", this.has(Items.PINK_DYE))
            .unlockedBy("has_blue_dye", this.has(Items.BLUE_DYE))
            .unlockedBy("has_red_dye", this.has(Items.RED_DYE))
            .save(this.output, "magenta_dye_from_blue_red_pink");
        this.oneToOneConversionRecipe(Items.MAGENTA_DYE, Blocks.LILAC, "magenta_dye", 2);
        this.shapeless(RecipeCategory.MISC, Items.MAGENTA_DYE, 2)
            .requires(Items.PURPLE_DYE)
            .requires(Items.PINK_DYE)
            .group("magenta_dye")
            .unlockedBy("has_pink_dye", this.has(Items.PINK_DYE))
            .unlockedBy("has_purple_dye", this.has(Items.PURPLE_DYE))
            .save(this.output, "magenta_dye_from_purple_and_pink");
        this.twoByTwoPacker(RecipeCategory.BUILDING_BLOCKS, Blocks.MAGMA_BLOCK, Items.MAGMA_CREAM);
        this.shapeless(RecipeCategory.BREWING, Items.MAGMA_CREAM)
            .requires(Items.BLAZE_POWDER)
            .requires(Items.SLIME_BALL)
            .unlockedBy("has_blaze_powder", this.has(Items.BLAZE_POWDER))
            .save(this.output);
        this.shaped(RecipeCategory.MISC, Items.MAP)
            .define('#', Items.PAPER)
            .define('X', Items.COMPASS)
            .pattern("###")
            .pattern("#X#")
            .pattern("###")
            .unlockedBy("has_compass", this.has(Items.COMPASS))
            .save(this.output);
        this.threeByThreePacker(RecipeCategory.BUILDING_BLOCKS, Blocks.MELON, Items.MELON_SLICE, "has_melon");
        this.shapeless(RecipeCategory.MISC, Items.MELON_SEEDS)
            .requires(Items.MELON_SLICE)
            .unlockedBy("has_melon", this.has(Items.MELON_SLICE))
            .save(this.output);
        this.shaped(RecipeCategory.TRANSPORTATION, Items.MINECART)
            .define('#', Items.IRON_INGOT)
            .pattern("# #")
            .pattern("###")
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.shapeless(RecipeCategory.BUILDING_BLOCKS, Blocks.MOSSY_COBBLESTONE)
            .requires(Blocks.COBBLESTONE)
            .requires(Blocks.VINE)
            .group("mossy_cobblestone")
            .unlockedBy("has_vine", this.has(Blocks.VINE))
            .save(this.output, getConversionRecipeName(Blocks.MOSSY_COBBLESTONE, Blocks.VINE));
        this.shapeless(RecipeCategory.BUILDING_BLOCKS, Blocks.MOSSY_STONE_BRICKS)
            .requires(Blocks.STONE_BRICKS)
            .requires(Blocks.VINE)
            .group("mossy_stone_bricks")
            .unlockedBy("has_vine", this.has(Blocks.VINE))
            .save(this.output, getConversionRecipeName(Blocks.MOSSY_STONE_BRICKS, Blocks.VINE));
        this.shapeless(RecipeCategory.BUILDING_BLOCKS, Blocks.MOSSY_COBBLESTONE)
            .requires(Blocks.COBBLESTONE)
            .requires(Blocks.MOSS_BLOCK)
            .group("mossy_cobblestone")
            .unlockedBy("has_moss_block", this.has(Blocks.MOSS_BLOCK))
            .save(this.output, getConversionRecipeName(Blocks.MOSSY_COBBLESTONE, Blocks.MOSS_BLOCK));
        this.shapeless(RecipeCategory.BUILDING_BLOCKS, Blocks.MOSSY_STONE_BRICKS)
            .requires(Blocks.STONE_BRICKS)
            .requires(Blocks.MOSS_BLOCK)
            .group("mossy_stone_bricks")
            .unlockedBy("has_moss_block", this.has(Blocks.MOSS_BLOCK))
            .save(this.output, getConversionRecipeName(Blocks.MOSSY_STONE_BRICKS, Blocks.MOSS_BLOCK));
        this.shapeless(RecipeCategory.FOOD, Items.MUSHROOM_STEW)
            .requires(Blocks.BROWN_MUSHROOM)
            .requires(Blocks.RED_MUSHROOM)
            .requires(Items.BOWL)
            .unlockedBy("has_mushroom_stew", this.has(Items.MUSHROOM_STEW))
            .unlockedBy("has_bowl", this.has(Items.BOWL))
            .unlockedBy("has_brown_mushroom", this.has(Blocks.BROWN_MUSHROOM))
            .unlockedBy("has_red_mushroom", this.has(Blocks.RED_MUSHROOM))
            .save(this.output);
        BuiltInRegistries.ITEM.stream().forEach(p_358453_ -> {
            SuspiciousEffectHolder suspiciouseffectholder = SuspiciousEffectHolder.tryGet(p_358453_);
            if (suspiciouseffectholder != null) {
                this.suspiciousStew(p_358453_, suspiciouseffectholder);
            }
        });
        this.twoByTwoPacker(RecipeCategory.BUILDING_BLOCKS, Blocks.NETHER_BRICKS, Items.NETHER_BRICK);
        this.twoByTwoPacker(RecipeCategory.BUILDING_BLOCKS, Blocks.RESIN_BRICKS, Items.RESIN_BRICK);
        this.nineBlockStorageRecipes(RecipeCategory.MISC, Items.RESIN_CLUMP, RecipeCategory.BUILDING_BLOCKS, Items.RESIN_BLOCK);
        this.shaped(RecipeCategory.MISC, Blocks.CREAKING_HEART)
            .define('R', Items.RESIN_BLOCK)
            .define('L', Blocks.PALE_OAK_LOG)
            .pattern(" L ")
            .pattern(" R ")
            .pattern(" L ")
            .unlockedBy("has_resin_block", this.has(Items.RESIN_BLOCK))
            .save(this.output);
        this.threeByThreePacker(RecipeCategory.BUILDING_BLOCKS, Blocks.NETHER_WART_BLOCK, Items.NETHER_WART);
        this.shaped(RecipeCategory.REDSTONE, Blocks.NOTE_BLOCK)
            .define('#', ItemTags.PLANKS)
            .define('X', Items.REDSTONE)
            .pattern("###")
            .pattern("#X#")
            .pattern("###")
            .unlockedBy("has_redstone", this.has(Items.REDSTONE))
            .save(this.output);
        this.shaped(RecipeCategory.REDSTONE, Blocks.OBSERVER)
            .define('Q', Items.QUARTZ)
            .define('R', Items.REDSTONE)
            .define('#', Blocks.COBBLESTONE)
            .pattern("###")
            .pattern("RRQ")
            .pattern("###")
            .unlockedBy("has_quartz", this.has(Items.QUARTZ))
            .save(this.output);
        this.oneToOneConversionRecipe(Items.ORANGE_DYE, Blocks.ORANGE_TULIP, "orange_dye");
        this.shapeless(RecipeCategory.MISC, Items.ORANGE_DYE, 2)
            .requires(Items.RED_DYE)
            .requires(Items.YELLOW_DYE)
            .group("orange_dye")
            .unlockedBy("has_red_dye", this.has(Items.RED_DYE))
            .unlockedBy("has_yellow_dye", this.has(Items.YELLOW_DYE))
            .save(this.output, "orange_dye_from_red_yellow");
        this.shaped(RecipeCategory.DECORATIONS, Items.PAINTING)
            .define('#', Items.STICK)
            .define('X', ItemTags.WOOL)
            .pattern("###")
            .pattern("#X#")
            .pattern("###")
            .unlockedBy("has_wool", this.has(ItemTags.WOOL))
            .save(this.output);
        this.shaped(RecipeCategory.MISC, Items.PAPER, 3)
            .define('#', Blocks.SUGAR_CANE)
            .pattern("###")
            .unlockedBy("has_reeds", this.has(Blocks.SUGAR_CANE))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.QUARTZ_PILLAR, 2)
            .define('#', Blocks.QUARTZ_BLOCK)
            .pattern("#")
            .pattern("#")
            .unlockedBy("has_chiseled_quartz_block", this.has(Blocks.CHISELED_QUARTZ_BLOCK))
            .unlockedBy("has_quartz_block", this.has(Blocks.QUARTZ_BLOCK))
            .unlockedBy("has_quartz_pillar", this.has(Blocks.QUARTZ_PILLAR))
            .save(this.output);
        this.threeByThreePacker(RecipeCategory.BUILDING_BLOCKS, Blocks.PACKED_ICE, Blocks.ICE);
        this.oneToOneConversionRecipe(Items.PINK_DYE, Blocks.PEONY, "pink_dye", 2);
        this.oneToOneConversionRecipe(Items.PINK_DYE, Blocks.PINK_TULIP, "pink_dye");
        this.shapeless(RecipeCategory.MISC, Items.PINK_DYE, 2)
            .requires(Items.RED_DYE)
            .requires(Items.WHITE_DYE)
            .group("pink_dye")
            .unlockedBy("has_white_dye", this.has(Items.WHITE_DYE))
            .unlockedBy("has_red_dye", this.has(Items.RED_DYE))
            .save(this.output, "pink_dye_from_red_white_dye");
        this.shaped(RecipeCategory.REDSTONE, Blocks.PISTON)
            .define('R', Items.REDSTONE)
            .define('#', Blocks.COBBLESTONE)
            .define('T', ItemTags.PLANKS)
            .define('X', Items.IRON_INGOT)
            .pattern("TTT")
            .pattern("#X#")
            .pattern("#R#")
            .unlockedBy("has_redstone", this.has(Items.REDSTONE))
            .save(this.output);
        this.polished(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BASALT, Blocks.BASALT);
        this.twoByTwoPacker(RecipeCategory.BUILDING_BLOCKS, Blocks.PRISMARINE, Items.PRISMARINE_SHARD);
        this.threeByThreePacker(RecipeCategory.BUILDING_BLOCKS, Blocks.PRISMARINE_BRICKS, Items.PRISMARINE_SHARD);
        this.shapeless(RecipeCategory.FOOD, Items.PUMPKIN_PIE)
            .requires(Blocks.PUMPKIN)
            .requires(Items.SUGAR)
            .requires(Items.EGG)
            .unlockedBy("has_carved_pumpkin", this.has(Blocks.CARVED_PUMPKIN))
            .unlockedBy("has_pumpkin", this.has(Blocks.PUMPKIN))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.PUMPKIN_SEEDS, 4)
            .requires(Blocks.PUMPKIN)
            .unlockedBy("has_pumpkin", this.has(Blocks.PUMPKIN))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.PURPLE_DYE, 2)
            .requires(Items.BLUE_DYE)
            .requires(Items.RED_DYE)
            .unlockedBy("has_blue_dye", this.has(Items.BLUE_DYE))
            .unlockedBy("has_red_dye", this.has(Items.RED_DYE))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.SHULKER_BOX)
            .define('#', Blocks.CHEST)
            .define('-', Items.SHULKER_SHELL)
            .pattern("-")
            .pattern("#")
            .pattern("-")
            .unlockedBy("has_shulker_shell", this.has(Items.SHULKER_SHELL))
            .save(this.output);
        this.shulkerBoxRecipes();
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.PURPUR_BLOCK, 4)
            .define('F', Items.POPPED_CHORUS_FRUIT)
            .pattern("FF")
            .pattern("FF")
            .unlockedBy("has_chorus_fruit_popped", this.has(Items.POPPED_CHORUS_FRUIT))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.PURPUR_PILLAR)
            .define('#', Blocks.PURPUR_SLAB)
            .pattern("#")
            .pattern("#")
            .unlockedBy("has_purpur_block", this.has(Blocks.PURPUR_BLOCK))
            .save(this.output);
        this.slabBuilder(RecipeCategory.BUILDING_BLOCKS, Blocks.PURPUR_SLAB, Ingredient.of(Blocks.PURPUR_BLOCK, Blocks.PURPUR_PILLAR))
            .unlockedBy("has_purpur_block", this.has(Blocks.PURPUR_BLOCK))
            .save(this.output);
        this.stairBuilder(Blocks.PURPUR_STAIRS, Ingredient.of(Blocks.PURPUR_BLOCK, Blocks.PURPUR_PILLAR))
            .unlockedBy("has_purpur_block", this.has(Blocks.PURPUR_BLOCK))
            .save(this.output);
        this.twoByTwoPacker(RecipeCategory.BUILDING_BLOCKS, Blocks.QUARTZ_BLOCK, Items.QUARTZ);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.QUARTZ_BRICKS, 4)
            .define('#', Blocks.QUARTZ_BLOCK)
            .pattern("##")
            .pattern("##")
            .unlockedBy("has_quartz_block", this.has(Blocks.QUARTZ_BLOCK))
            .save(this.output);
        this.slabBuilder(RecipeCategory.BUILDING_BLOCKS, Blocks.QUARTZ_SLAB, Ingredient.of(Blocks.CHISELED_QUARTZ_BLOCK, Blocks.QUARTZ_BLOCK, Blocks.QUARTZ_PILLAR))
            .unlockedBy("has_chiseled_quartz_block", this.has(Blocks.CHISELED_QUARTZ_BLOCK))
            .unlockedBy("has_quartz_block", this.has(Blocks.QUARTZ_BLOCK))
            .unlockedBy("has_quartz_pillar", this.has(Blocks.QUARTZ_PILLAR))
            .save(this.output);
        this.stairBuilder(Blocks.QUARTZ_STAIRS, Ingredient.of(Blocks.CHISELED_QUARTZ_BLOCK, Blocks.QUARTZ_BLOCK, Blocks.QUARTZ_PILLAR))
            .unlockedBy("has_chiseled_quartz_block", this.has(Blocks.CHISELED_QUARTZ_BLOCK))
            .unlockedBy("has_quartz_block", this.has(Blocks.QUARTZ_BLOCK))
            .unlockedBy("has_quartz_pillar", this.has(Blocks.QUARTZ_PILLAR))
            .save(this.output);
        this.shapeless(RecipeCategory.FOOD, Items.RABBIT_STEW)
            .requires(Items.BAKED_POTATO)
            .requires(Items.COOKED_RABBIT)
            .requires(Items.BOWL)
            .requires(Items.CARROT)
            .requires(Blocks.BROWN_MUSHROOM)
            .group("rabbit_stew")
            .unlockedBy("has_cooked_rabbit", this.has(Items.COOKED_RABBIT))
            .save(this.output, getConversionRecipeName(Items.RABBIT_STEW, Items.BROWN_MUSHROOM));
        this.shapeless(RecipeCategory.FOOD, Items.RABBIT_STEW)
            .requires(Items.BAKED_POTATO)
            .requires(Items.COOKED_RABBIT)
            .requires(Items.BOWL)
            .requires(Items.CARROT)
            .requires(Blocks.RED_MUSHROOM)
            .group("rabbit_stew")
            .unlockedBy("has_cooked_rabbit", this.has(Items.COOKED_RABBIT))
            .save(this.output, getConversionRecipeName(Items.RABBIT_STEW, Items.RED_MUSHROOM));
        this.shaped(RecipeCategory.TRANSPORTATION, Blocks.RAIL, 16)
            .define('#', Items.STICK)
            .define('X', Items.IRON_INGOT)
            .pattern("X X")
            .pattern("X#X")
            .pattern("X X")
            .unlockedBy("has_minecart", this.has(Items.MINECART))
            .save(this.output);
        this.nineBlockStorageRecipes(RecipeCategory.REDSTONE, Items.REDSTONE, RecipeCategory.REDSTONE, Items.REDSTONE_BLOCK);
        this.shaped(RecipeCategory.REDSTONE, Blocks.REDSTONE_LAMP)
            .define('R', Items.REDSTONE)
            .define('G', Blocks.GLOWSTONE)
            .pattern(" R ")
            .pattern("RGR")
            .pattern(" R ")
            .unlockedBy("has_glowstone", this.has(Blocks.GLOWSTONE))
            .save(this.output);
        this.shaped(RecipeCategory.REDSTONE, Blocks.REDSTONE_TORCH)
            .define('#', Items.STICK)
            .define('X', Items.REDSTONE)
            .pattern("X")
            .pattern("#")
            .unlockedBy("has_redstone", this.has(Items.REDSTONE))
            .save(this.output);
        this.oneToOneConversionRecipe(Items.RED_DYE, Items.BEETROOT, "red_dye");
        this.oneToOneConversionRecipe(Items.RED_DYE, Blocks.POPPY, "red_dye");
        this.oneToOneConversionRecipe(Items.RED_DYE, Blocks.ROSE_BUSH, "red_dye", 2);
        this.oneToOneConversionRecipe(Items.ORANGE_DYE, Blocks.OPEN_EYEBLOSSOM, "orange_dye");
        this.oneToOneConversionRecipe(Items.GRAY_DYE, Blocks.CLOSED_EYEBLOSSOM, "gray_dye");
        this.shapeless(RecipeCategory.MISC, Items.RED_DYE)
            .requires(Blocks.RED_TULIP)
            .group("red_dye")
            .unlockedBy("has_red_flower", this.has(Blocks.RED_TULIP))
            .save(this.output, "red_dye_from_tulip");
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.RED_NETHER_BRICKS)
            .define('W', Items.NETHER_WART)
            .define('N', Items.NETHER_BRICK)
            .pattern("NW")
            .pattern("WN")
            .unlockedBy("has_nether_wart", this.has(Items.NETHER_WART))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.RED_SANDSTONE)
            .define('#', Blocks.RED_SAND)
            .pattern("##")
            .pattern("##")
            .unlockedBy("has_sand", this.has(Blocks.RED_SAND))
            .save(this.output);
        this.slabBuilder(RecipeCategory.BUILDING_BLOCKS, Blocks.RED_SANDSTONE_SLAB, Ingredient.of(Blocks.RED_SANDSTONE, Blocks.CHISELED_RED_SANDSTONE))
            .unlockedBy("has_red_sandstone", this.has(Blocks.RED_SANDSTONE))
            .unlockedBy("has_chiseled_red_sandstone", this.has(Blocks.CHISELED_RED_SANDSTONE))
            .save(this.output);
        this.stairBuilder(Blocks.RED_SANDSTONE_STAIRS, Ingredient.of(Blocks.RED_SANDSTONE, Blocks.CHISELED_RED_SANDSTONE, Blocks.CUT_RED_SANDSTONE))
            .unlockedBy("has_red_sandstone", this.has(Blocks.RED_SANDSTONE))
            .unlockedBy("has_chiseled_red_sandstone", this.has(Blocks.CHISELED_RED_SANDSTONE))
            .unlockedBy("has_cut_red_sandstone", this.has(Blocks.CUT_RED_SANDSTONE))
            .save(this.output);
        this.shaped(RecipeCategory.REDSTONE, Blocks.REPEATER)
            .define('#', Blocks.REDSTONE_TORCH)
            .define('X', Items.REDSTONE)
            .define('I', Blocks.STONE)
            .pattern("#X#")
            .pattern("III")
            .unlockedBy("has_redstone_torch", this.has(Blocks.REDSTONE_TORCH))
            .save(this.output);
        this.twoByTwoPacker(RecipeCategory.BUILDING_BLOCKS, Blocks.SANDSTONE, Blocks.SAND);
        this.slabBuilder(RecipeCategory.BUILDING_BLOCKS, Blocks.SANDSTONE_SLAB, Ingredient.of(Blocks.SANDSTONE, Blocks.CHISELED_SANDSTONE))
            .unlockedBy("has_sandstone", this.has(Blocks.SANDSTONE))
            .unlockedBy("has_chiseled_sandstone", this.has(Blocks.CHISELED_SANDSTONE))
            .save(this.output);
        this.stairBuilder(Blocks.SANDSTONE_STAIRS, Ingredient.of(Blocks.SANDSTONE, Blocks.CHISELED_SANDSTONE, Blocks.CUT_SANDSTONE))
            .unlockedBy("has_sandstone", this.has(Blocks.SANDSTONE))
            .unlockedBy("has_chiseled_sandstone", this.has(Blocks.CHISELED_SANDSTONE))
            .unlockedBy("has_cut_sandstone", this.has(Blocks.CUT_SANDSTONE))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.SEA_LANTERN)
            .define('S', Items.PRISMARINE_SHARD)
            .define('C', Items.PRISMARINE_CRYSTALS)
            .pattern("SCS")
            .pattern("CCC")
            .pattern("SCS")
            .unlockedBy("has_prismarine_crystals", this.has(Items.PRISMARINE_CRYSTALS))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.SHEARS)
            .define('#', Items.IRON_INGOT)
            .pattern(" #")
            .pattern("# ")
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.SHIELD)
            .define('W', ItemTags.WOODEN_TOOL_MATERIALS)
            .define('o', Items.IRON_INGOT)
            .pattern("WoW")
            .pattern("WWW")
            .pattern(" W ")
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.nineBlockStorageRecipes(RecipeCategory.MISC, Items.SLIME_BALL, RecipeCategory.REDSTONE, Items.SLIME_BLOCK);
        this.cut(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_RED_SANDSTONE, Blocks.RED_SANDSTONE);
        this.cut(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_SANDSTONE, Blocks.SANDSTONE);
        this.twoByTwoPacker(RecipeCategory.BUILDING_BLOCKS, Blocks.SNOW_BLOCK, Items.SNOWBALL);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.SNOW, 6)
            .define('#', Blocks.SNOW_BLOCK)
            .pattern("###")
            .unlockedBy("has_snowball", this.has(Items.SNOWBALL))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.SOUL_CAMPFIRE)
            .define('L', ItemTags.LOGS)
            .define('S', Items.STICK)
            .define('#', ItemTags.SOUL_FIRE_BASE_BLOCKS)
            .pattern(" S ")
            .pattern("S#S")
            .pattern("LLL")
            .unlockedBy("has_soul_sand", this.has(ItemTags.SOUL_FIRE_BASE_BLOCKS))
            .save(this.output);
        this.shaped(RecipeCategory.BREWING, Items.GLISTERING_MELON_SLICE)
            .define('#', Items.GOLD_NUGGET)
            .define('X', Items.MELON_SLICE)
            .pattern("###")
            .pattern("#X#")
            .pattern("###")
            .unlockedBy("has_melon", this.has(Items.MELON_SLICE))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.SPECTRAL_ARROW, 2)
            .define('#', Items.GLOWSTONE_DUST)
            .define('X', Items.ARROW)
            .pattern(" # ")
            .pattern("#X#")
            .pattern(" # ")
            .unlockedBy("has_glowstone_dust", this.has(Items.GLOWSTONE_DUST))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.SPYGLASS)
            .define('#', Items.AMETHYST_SHARD)
            .define('X', Items.COPPER_INGOT)
            .pattern(" # ")
            .pattern(" X ")
            .pattern(" X ")
            .unlockedBy("has_amethyst_shard", this.has(Items.AMETHYST_SHARD))
            .save(this.output);
        this.shaped(RecipeCategory.MISC, Items.STICK, 4)
            .define('#', ItemTags.PLANKS)
            .pattern("#")
            .pattern("#")
            .group("sticks")
            .unlockedBy("has_planks", this.has(ItemTags.PLANKS))
            .save(this.output);
        this.shaped(RecipeCategory.MISC, Items.STICK, 1)
            .define('#', Blocks.BAMBOO)
            .pattern("#")
            .pattern("#")
            .group("sticks")
            .unlockedBy("has_bamboo", this.has(Blocks.BAMBOO))
            .save(this.output, "stick_from_bamboo_item");
        this.shaped(RecipeCategory.REDSTONE, Blocks.STICKY_PISTON)
            .define('P', Blocks.PISTON)
            .define('S', Items.SLIME_BALL)
            .pattern("S")
            .pattern("P")
            .unlockedBy("has_slime_ball", this.has(Items.SLIME_BALL))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.STONE_BRICKS, 4)
            .define('#', Blocks.STONE)
            .pattern("##")
            .pattern("##")
            .unlockedBy("has_stone", this.has(Blocks.STONE))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.STONE_AXE)
            .define('#', Items.STICK)
            .define('X', ItemTags.STONE_TOOL_MATERIALS)
            .pattern("XX")
            .pattern("X#")
            .pattern(" #")
            .unlockedBy("has_cobblestone", this.has(ItemTags.STONE_TOOL_MATERIALS))
            .save(this.output);
        this.slabBuilder(RecipeCategory.BUILDING_BLOCKS, Blocks.STONE_BRICK_SLAB, Ingredient.of(Blocks.STONE_BRICKS))
            .unlockedBy("has_stone_bricks", this.has(ItemTags.STONE_BRICKS))
            .save(this.output);
        this.stairBuilder(Blocks.STONE_BRICK_STAIRS, Ingredient.of(Blocks.STONE_BRICKS))
            .unlockedBy("has_stone_bricks", this.has(ItemTags.STONE_BRICKS))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.STONE_HOE)
            .define('#', Items.STICK)
            .define('X', ItemTags.STONE_TOOL_MATERIALS)
            .pattern("XX")
            .pattern(" #")
            .pattern(" #")
            .unlockedBy("has_cobblestone", this.has(ItemTags.STONE_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.STONE_PICKAXE)
            .define('#', Items.STICK)
            .define('X', ItemTags.STONE_TOOL_MATERIALS)
            .pattern("XXX")
            .pattern(" # ")
            .pattern(" # ")
            .unlockedBy("has_cobblestone", this.has(ItemTags.STONE_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.STONE_SHOVEL)
            .define('#', Items.STICK)
            .define('X', ItemTags.STONE_TOOL_MATERIALS)
            .pattern("X")
            .pattern("#")
            .pattern("#")
            .unlockedBy("has_cobblestone", this.has(ItemTags.STONE_TOOL_MATERIALS))
            .save(this.output);
        this.slab(RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_STONE_SLAB, Blocks.SMOOTH_STONE);
        this.shaped(RecipeCategory.COMBAT, Items.STONE_SWORD)
            .define('#', Items.STICK)
            .define('X', ItemTags.STONE_TOOL_MATERIALS)
            .pattern("X")
            .pattern("X")
            .pattern("#")
            .unlockedBy("has_cobblestone", this.has(ItemTags.STONE_TOOL_MATERIALS))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.WHITE_WOOL)
            .define('#', Items.STRING)
            .pattern("##")
            .pattern("##")
            .unlockedBy("has_string", this.has(Items.STRING))
            .save(this.output, getConversionRecipeName(Blocks.WHITE_WOOL, Items.STRING));
        this.oneToOneConversionRecipe(Items.SUGAR, Blocks.SUGAR_CANE, "sugar");
        this.shapeless(RecipeCategory.MISC, Items.SUGAR, 3)
            .requires(Items.HONEY_BOTTLE)
            .group("sugar")
            .unlockedBy("has_honey_bottle", this.has(Items.HONEY_BOTTLE))
            .save(this.output, getConversionRecipeName(Items.SUGAR, Items.HONEY_BOTTLE));
        this.shaped(RecipeCategory.REDSTONE, Blocks.TARGET)
            .define('H', Items.HAY_BLOCK)
            .define('R', Items.REDSTONE)
            .pattern(" R ")
            .pattern("RHR")
            .pattern(" R ")
            .unlockedBy("has_redstone", this.has(Items.REDSTONE))
            .unlockedBy("has_hay_block", this.has(Blocks.HAY_BLOCK))
            .save(this.output);
        this.shaped(RecipeCategory.REDSTONE, Blocks.TNT)
            .define('#', Ingredient.of(Blocks.SAND, Blocks.RED_SAND))
            .define('X', Items.GUNPOWDER)
            .pattern("X#X")
            .pattern("#X#")
            .pattern("X#X")
            .unlockedBy("has_gunpowder", this.has(Items.GUNPOWDER))
            .save(this.output);
        this.shapeless(RecipeCategory.TRANSPORTATION, Items.TNT_MINECART)
            .requires(Blocks.TNT)
            .requires(Items.MINECART)
            .unlockedBy("has_minecart", this.has(Items.MINECART))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.TORCH, 4)
            .define('#', Items.STICK)
            .define('X', Ingredient.of(Items.COAL, Items.CHARCOAL))
            .pattern("X")
            .pattern("#")
            .unlockedBy("has_stone_pickaxe", this.has(Items.STONE_PICKAXE))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.SOUL_TORCH, 4)
            .define('X', Ingredient.of(Items.COAL, Items.CHARCOAL))
            .define('#', Items.STICK)
            .define('S', ItemTags.SOUL_FIRE_BASE_BLOCKS)
            .pattern("X")
            .pattern("#")
            .pattern("S")
            .unlockedBy("has_soul_sand", this.has(ItemTags.SOUL_FIRE_BASE_BLOCKS))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.LANTERN)
            .define('#', Items.TORCH)
            .define('X', Items.IRON_NUGGET)
            .pattern("XXX")
            .pattern("X#X")
            .pattern("XXX")
            .unlockedBy("has_iron_nugget", this.has(Items.IRON_NUGGET))
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.SOUL_LANTERN)
            .define('#', Items.SOUL_TORCH)
            .define('X', Items.IRON_NUGGET)
            .pattern("XXX")
            .pattern("X#X")
            .pattern("XXX")
            .unlockedBy("has_soul_torch", this.has(Items.SOUL_TORCH))
            .save(this.output);
        this.shapeless(RecipeCategory.REDSTONE, Blocks.TRAPPED_CHEST)
            .requires(Blocks.CHEST)
            .requires(Blocks.TRIPWIRE_HOOK)
            .unlockedBy("has_tripwire_hook", this.has(Blocks.TRIPWIRE_HOOK))
            .save(this.output);
        this.shaped(RecipeCategory.REDSTONE, Blocks.TRIPWIRE_HOOK, 2)
            .define('#', ItemTags.PLANKS)
            .define('S', Items.STICK)
            .define('I', Items.IRON_INGOT)
            .pattern("I")
            .pattern("S")
            .pattern("#")
            .unlockedBy("has_string", this.has(Items.STRING))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.TURTLE_HELMET)
            .define('X', Items.TURTLE_SCUTE)
            .pattern("XXX")
            .pattern("X X")
            .unlockedBy("has_turtle_scute", this.has(Items.TURTLE_SCUTE))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.WOLF_ARMOR)
            .define('X', Items.ARMADILLO_SCUTE)
            .pattern("X  ")
            .pattern("XXX")
            .pattern("X X")
            .unlockedBy("has_armadillo_scute", this.has(Items.ARMADILLO_SCUTE))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.WHEAT, 9)
            .requires(Blocks.HAY_BLOCK)
            .unlockedBy("has_hay_block", this.has(Blocks.HAY_BLOCK))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.WHITE_DYE)
            .requires(Items.BONE_MEAL)
            .group("white_dye")
            .unlockedBy("has_bone_meal", this.has(Items.BONE_MEAL))
            .save(this.output);
        this.oneToOneConversionRecipe(Items.WHITE_DYE, Blocks.LILY_OF_THE_VALLEY, "white_dye");
        this.shaped(RecipeCategory.TOOLS, Items.WOODEN_AXE)
            .define('#', Items.STICK)
            .define('X', ItemTags.WOODEN_TOOL_MATERIALS)
            .pattern("XX")
            .pattern("X#")
            .pattern(" #")
            .unlockedBy("has_stick", this.has(Items.STICK))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.WOODEN_HOE)
            .define('#', Items.STICK)
            .define('X', ItemTags.WOODEN_TOOL_MATERIALS)
            .pattern("XX")
            .pattern(" #")
            .pattern(" #")
            .unlockedBy("has_stick", this.has(Items.STICK))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.WOODEN_PICKAXE)
            .define('#', Items.STICK)
            .define('X', ItemTags.WOODEN_TOOL_MATERIALS)
            .pattern("XXX")
            .pattern(" # ")
            .pattern(" # ")
            .unlockedBy("has_stick", this.has(Items.STICK))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.WOODEN_SHOVEL)
            .define('#', Items.STICK)
            .define('X', ItemTags.WOODEN_TOOL_MATERIALS)
            .pattern("X")
            .pattern("#")
            .pattern("#")
            .unlockedBy("has_stick", this.has(Items.STICK))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.WOODEN_SWORD)
            .define('#', Items.STICK)
            .define('X', ItemTags.WOODEN_TOOL_MATERIALS)
            .pattern("X")
            .pattern("X")
            .pattern("#")
            .unlockedBy("has_stick", this.has(Items.STICK))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.WRITABLE_BOOK)
            .requires(Items.BOOK)
            .requires(Items.INK_SAC)
            .requires(Items.FEATHER)
            .unlockedBy("has_book", this.has(Items.BOOK))
            .save(this.output);
        this.oneToOneConversionRecipe(Items.YELLOW_DYE, Blocks.DANDELION, "yellow_dye");
        this.oneToOneConversionRecipe(Items.YELLOW_DYE, Blocks.SUNFLOWER, "yellow_dye", 2);
        this.nineBlockStorageRecipes(RecipeCategory.FOOD, Items.DRIED_KELP, RecipeCategory.BUILDING_BLOCKS, Items.DRIED_KELP_BLOCK);
        this.shaped(RecipeCategory.MISC, Blocks.CONDUIT)
            .define('#', Items.NAUTILUS_SHELL)
            .define('X', Items.HEART_OF_THE_SEA)
            .pattern("###")
            .pattern("#X#")
            .pattern("###")
            .unlockedBy("has_nautilus_core", this.has(Items.HEART_OF_THE_SEA))
            .unlockedBy("has_nautilus_shell", this.has(Items.NAUTILUS_SHELL))
            .save(this.output);
        this.wall(RecipeCategory.DECORATIONS, Blocks.RED_SANDSTONE_WALL, Blocks.RED_SANDSTONE);
        this.wall(RecipeCategory.DECORATIONS, Blocks.STONE_BRICK_WALL, Blocks.STONE_BRICKS);
        this.wall(RecipeCategory.DECORATIONS, Blocks.SANDSTONE_WALL, Blocks.SANDSTONE);
        this.shapeless(RecipeCategory.MISC, Items.FIELD_MASONED_BANNER_PATTERN)
            .requires(Items.PAPER)
            .requires(Blocks.BRICKS)
            .unlockedBy("has_bricks", this.has(Blocks.BRICKS))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.BORDURE_INDENTED_BANNER_PATTERN)
            .requires(Items.PAPER)
            .requires(Blocks.VINE)
            .unlockedBy("has_vines", this.has(Blocks.VINE))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.CREEPER_BANNER_PATTERN)
            .requires(Items.PAPER)
            .requires(Items.CREEPER_HEAD)
            .unlockedBy("has_creeper_head", this.has(Items.CREEPER_HEAD))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.SKULL_BANNER_PATTERN)
            .requires(Items.PAPER)
            .requires(Items.WITHER_SKELETON_SKULL)
            .unlockedBy("has_wither_skeleton_skull", this.has(Items.WITHER_SKELETON_SKULL))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.FLOWER_BANNER_PATTERN)
            .requires(Items.PAPER)
            .requires(Blocks.OXEYE_DAISY)
            .unlockedBy("has_oxeye_daisy", this.has(Blocks.OXEYE_DAISY))
            .save(this.output);
        this.shapeless(RecipeCategory.MISC, Items.MOJANG_BANNER_PATTERN)
            .requires(Items.PAPER)
            .requires(Items.ENCHANTED_GOLDEN_APPLE)
            .unlockedBy("has_enchanted_golden_apple", this.has(Items.ENCHANTED_GOLDEN_APPLE))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.SCAFFOLDING, 6)
            .define('~', Items.STRING)
            .define('I', Blocks.BAMBOO)
            .pattern("I~I")
            .pattern("I I")
            .pattern("I I")
            .unlockedBy("has_bamboo", this.has(Blocks.BAMBOO))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.GRINDSTONE)
            .define('I', Items.STICK)
            .define('-', Blocks.STONE_SLAB)
            .define('#', ItemTags.PLANKS)
            .pattern("I-I")
            .pattern("# #")
            .unlockedBy("has_stone_slab", this.has(Blocks.STONE_SLAB))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.BLAST_FURNACE)
            .define('#', Blocks.SMOOTH_STONE)
            .define('X', Blocks.FURNACE)
            .define('I', Items.IRON_INGOT)
            .pattern("III")
            .pattern("IXI")
            .pattern("###")
            .unlockedBy("has_smooth_stone", this.has(Blocks.SMOOTH_STONE))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.SMOKER)
            .define('#', ItemTags.LOGS)
            .define('X', Blocks.FURNACE)
            .pattern(" # ")
            .pattern("#X#")
            .pattern(" # ")
            .unlockedBy("has_furnace", this.has(Blocks.FURNACE))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.CARTOGRAPHY_TABLE)
            .define('#', ItemTags.PLANKS)
            .define('@', Items.PAPER)
            .pattern("@@")
            .pattern("##")
            .pattern("##")
            .unlockedBy("has_paper", this.has(Items.PAPER))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.SMITHING_TABLE)
            .define('#', ItemTags.PLANKS)
            .define('@', Items.IRON_INGOT)
            .pattern("@@")
            .pattern("##")
            .pattern("##")
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.FLETCHING_TABLE)
            .define('#', ItemTags.PLANKS)
            .define('@', Items.FLINT)
            .pattern("@@")
            .pattern("##")
            .pattern("##")
            .unlockedBy("has_flint", this.has(Items.FLINT))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.STONECUTTER)
            .define('I', Items.IRON_INGOT)
            .define('#', Blocks.STONE)
            .pattern(" I ")
            .pattern("###")
            .unlockedBy("has_stone", this.has(Blocks.STONE))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.LODESTONE)
            .define('S', Items.CHISELED_STONE_BRICKS)
            .define('#', Items.NETHERITE_INGOT)
            .pattern("SSS")
            .pattern("S#S")
            .pattern("SSS")
            .unlockedBy("has_netherite_ingot", this.has(Items.NETHERITE_INGOT))
            .save(this.output);
        this.nineBlockStorageRecipesRecipesWithCustomUnpacking(
            RecipeCategory.MISC, Items.NETHERITE_INGOT, RecipeCategory.BUILDING_BLOCKS, Items.NETHERITE_BLOCK, "netherite_ingot_from_netherite_block", "netherite_ingot"
        );
        this.shapeless(RecipeCategory.MISC, Items.NETHERITE_INGOT)
            .requires(Items.NETHERITE_SCRAP, 4)
            .requires(Items.GOLD_INGOT, 4)
            .group("netherite_ingot")
            .unlockedBy("has_netherite_scrap", this.has(Items.NETHERITE_SCRAP))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.RESPAWN_ANCHOR)
            .define('O', Blocks.CRYING_OBSIDIAN)
            .define('G', Blocks.GLOWSTONE)
            .pattern("OOO")
            .pattern("GGG")
            .pattern("OOO")
            .unlockedBy("has_obsidian", this.has(Blocks.CRYING_OBSIDIAN))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Blocks.CHAIN)
            .define('I', Items.IRON_INGOT)
            .define('N', Items.IRON_NUGGET)
            .pattern("N")
            .pattern("I")
            .pattern("N")
            .unlockedBy("has_iron_nugget", this.has(Items.IRON_NUGGET))
            .unlockedBy("has_iron_ingot", this.has(Items.IRON_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.TINTED_GLASS, 2)
            .define('G', Blocks.GLASS)
            .define('S', Items.AMETHYST_SHARD)
            .pattern(" S ")
            .pattern("SGS")
            .pattern(" S ")
            .unlockedBy("has_amethyst_shard", this.has(Items.AMETHYST_SHARD))
            .save(this.output);
        this.twoByTwoPacker(RecipeCategory.BUILDING_BLOCKS, Blocks.AMETHYST_BLOCK, Items.AMETHYST_SHARD);
        this.shaped(RecipeCategory.TOOLS, Items.RECOVERY_COMPASS)
            .define('C', Items.COMPASS)
            .define('S', Items.ECHO_SHARD)
            .pattern("SSS")
            .pattern("SCS")
            .pattern("SSS")
            .unlockedBy("has_echo_shard", this.has(Items.ECHO_SHARD))
            .save(this.output);
        this.shaped(RecipeCategory.REDSTONE, Items.CALIBRATED_SCULK_SENSOR)
            .define('#', Items.AMETHYST_SHARD)
            .define('X', Items.SCULK_SENSOR)
            .pattern(" # ")
            .pattern("#X#")
            .unlockedBy("has_amethyst_shard", this.has(Items.AMETHYST_SHARD))
            .save(this.output);
        this.threeByThreePacker(RecipeCategory.MISC, Items.MUSIC_DISC_5, Items.DISC_FRAGMENT_5);
        SpecialRecipeBuilder.special(ArmorDyeRecipe::new).save(this.output, "armor_dye");
        SpecialRecipeBuilder.special(BannerDuplicateRecipe::new).save(this.output, "banner_duplicate");
        SpecialRecipeBuilder.special(BookCloningRecipe::new).save(this.output, "book_cloning");
        SpecialRecipeBuilder.special(FireworkRocketRecipe::new).save(this.output, "firework_rocket");
        SpecialRecipeBuilder.special(FireworkStarRecipe::new).save(this.output, "firework_star");
        SpecialRecipeBuilder.special(FireworkStarFadeRecipe::new).save(this.output, "firework_star_fade");
        SpecialRecipeBuilder.special(MapCloningRecipe::new).save(this.output, "map_cloning");
        SpecialRecipeBuilder.special(MapExtendingRecipe::new).save(this.output, "map_extending");
        SpecialRecipeBuilder.special(RepairItemRecipe::new).save(this.output, "repair_item");
        SpecialRecipeBuilder.special(ShieldDecorationRecipe::new).save(this.output, "shield_decoration");
        SpecialRecipeBuilder.special(TippedArrowRecipe::new).save(this.output, "tipped_arrow");
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Items.POTATO), RecipeCategory.FOOD, Items.BAKED_POTATO, 0.35F, 200)
            .unlockedBy("has_potato", this.has(Items.POTATO))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Items.CLAY_BALL), RecipeCategory.MISC, Items.BRICK, 0.3F, 200)
            .unlockedBy("has_clay_ball", this.has(Items.CLAY_BALL))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(this.tag(ItemTags.LOGS_THAT_BURN), RecipeCategory.MISC, Items.CHARCOAL, 0.15F, 200)
            .unlockedBy("has_log", this.has(ItemTags.LOGS_THAT_BURN))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Items.CHORUS_FRUIT), RecipeCategory.MISC, Items.POPPED_CHORUS_FRUIT, 0.1F, 200)
            .unlockedBy("has_chorus_fruit", this.has(Items.CHORUS_FRUIT))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Items.BEEF), RecipeCategory.FOOD, Items.COOKED_BEEF, 0.35F, 200)
            .unlockedBy("has_beef", this.has(Items.BEEF))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Items.CHICKEN), RecipeCategory.FOOD, Items.COOKED_CHICKEN, 0.35F, 200)
            .unlockedBy("has_chicken", this.has(Items.CHICKEN))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Items.COD), RecipeCategory.FOOD, Items.COOKED_COD, 0.35F, 200)
            .unlockedBy("has_cod", this.has(Items.COD))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.KELP), RecipeCategory.FOOD, Items.DRIED_KELP, 0.1F, 200)
            .unlockedBy("has_kelp", this.has(Blocks.KELP))
            .save(this.output, getSmeltingRecipeName(Items.DRIED_KELP));
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Items.SALMON), RecipeCategory.FOOD, Items.COOKED_SALMON, 0.35F, 200)
            .unlockedBy("has_salmon", this.has(Items.SALMON))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Items.MUTTON), RecipeCategory.FOOD, Items.COOKED_MUTTON, 0.35F, 200)
            .unlockedBy("has_mutton", this.has(Items.MUTTON))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Items.PORKCHOP), RecipeCategory.FOOD, Items.COOKED_PORKCHOP, 0.35F, 200)
            .unlockedBy("has_porkchop", this.has(Items.PORKCHOP))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Items.RABBIT), RecipeCategory.FOOD, Items.COOKED_RABBIT, 0.35F, 200)
            .unlockedBy("has_rabbit", this.has(Items.RABBIT))
            .save(this.output);
        this.oreSmelting(COAL_SMELTABLES, RecipeCategory.MISC, Items.COAL, 0.1F, 200, "coal");
        this.oreSmelting(IRON_SMELTABLES, RecipeCategory.MISC, Items.IRON_INGOT, 0.7F, 200, "iron_ingot");
        this.oreSmelting(COPPER_SMELTABLES, RecipeCategory.MISC, Items.COPPER_INGOT, 0.7F, 200, "copper_ingot");
        this.oreSmelting(GOLD_SMELTABLES, RecipeCategory.MISC, Items.GOLD_INGOT, 1.0F, 200, "gold_ingot");
        this.oreSmelting(DIAMOND_SMELTABLES, RecipeCategory.MISC, Items.DIAMOND, 1.0F, 200, "diamond");
        this.oreSmelting(LAPIS_SMELTABLES, RecipeCategory.MISC, Items.LAPIS_LAZULI, 0.2F, 200, "lapis_lazuli");
        this.oreSmelting(REDSTONE_SMELTABLES, RecipeCategory.REDSTONE, Items.REDSTONE, 0.7F, 200, "redstone");
        this.oreSmelting(EMERALD_SMELTABLES, RecipeCategory.MISC, Items.EMERALD, 1.0F, 200, "emerald");
        this.nineBlockStorageRecipes(RecipeCategory.MISC, Items.RAW_IRON, RecipeCategory.BUILDING_BLOCKS, Items.RAW_IRON_BLOCK);
        this.nineBlockStorageRecipes(RecipeCategory.MISC, Items.RAW_COPPER, RecipeCategory.BUILDING_BLOCKS, Items.RAW_COPPER_BLOCK);
        this.nineBlockStorageRecipes(RecipeCategory.MISC, Items.RAW_GOLD, RecipeCategory.BUILDING_BLOCKS, Items.RAW_GOLD_BLOCK);
        SimpleCookingRecipeBuilder.smelting(this.tag(ItemTags.SMELTS_TO_GLASS), RecipeCategory.BUILDING_BLOCKS, Blocks.GLASS.asItem(), 0.1F, 200)
            .unlockedBy("has_smelts_to_glass", this.has(ItemTags.SMELTS_TO_GLASS))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.SEA_PICKLE), RecipeCategory.MISC, Items.LIME_DYE, 0.1F, 200)
            .unlockedBy("has_sea_pickle", this.has(Blocks.SEA_PICKLE))
            .save(this.output, getSmeltingRecipeName(Items.LIME_DYE));
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.CACTUS.asItem()), RecipeCategory.MISC, Items.GREEN_DYE, 1.0F, 200)
            .unlockedBy("has_cactus", this.has(Blocks.CACTUS))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(
                Ingredient.of(
                    Items.GOLDEN_PICKAXE,
                    Items.GOLDEN_SHOVEL,
                    Items.GOLDEN_AXE,
                    Items.GOLDEN_HOE,
                    Items.GOLDEN_SWORD,
                    Items.GOLDEN_HELMET,
                    Items.GOLDEN_CHESTPLATE,
                    Items.GOLDEN_LEGGINGS,
                    Items.GOLDEN_BOOTS,
                    Items.GOLDEN_HORSE_ARMOR
                ),
                RecipeCategory.MISC,
                Items.GOLD_NUGGET,
                0.1F,
                200
            )
            .unlockedBy("has_golden_pickaxe", this.has(Items.GOLDEN_PICKAXE))
            .unlockedBy("has_golden_shovel", this.has(Items.GOLDEN_SHOVEL))
            .unlockedBy("has_golden_axe", this.has(Items.GOLDEN_AXE))
            .unlockedBy("has_golden_hoe", this.has(Items.GOLDEN_HOE))
            .unlockedBy("has_golden_sword", this.has(Items.GOLDEN_SWORD))
            .unlockedBy("has_golden_helmet", this.has(Items.GOLDEN_HELMET))
            .unlockedBy("has_golden_chestplate", this.has(Items.GOLDEN_CHESTPLATE))
            .unlockedBy("has_golden_leggings", this.has(Items.GOLDEN_LEGGINGS))
            .unlockedBy("has_golden_boots", this.has(Items.GOLDEN_BOOTS))
            .unlockedBy("has_golden_horse_armor", this.has(Items.GOLDEN_HORSE_ARMOR))
            .save(this.output, getSmeltingRecipeName(Items.GOLD_NUGGET));
        SimpleCookingRecipeBuilder.smelting(
                Ingredient.of(
                    Items.IRON_PICKAXE,
                    Items.IRON_SHOVEL,
                    Items.IRON_AXE,
                    Items.IRON_HOE,
                    Items.IRON_SWORD,
                    Items.IRON_HELMET,
                    Items.IRON_CHESTPLATE,
                    Items.IRON_LEGGINGS,
                    Items.IRON_BOOTS,
                    Items.IRON_HORSE_ARMOR,
                    Items.CHAINMAIL_HELMET,
                    Items.CHAINMAIL_CHESTPLATE,
                    Items.CHAINMAIL_LEGGINGS,
                    Items.CHAINMAIL_BOOTS
                ),
                RecipeCategory.MISC,
                Items.IRON_NUGGET,
                0.1F,
                200
            )
            .unlockedBy("has_iron_pickaxe", this.has(Items.IRON_PICKAXE))
            .unlockedBy("has_iron_shovel", this.has(Items.IRON_SHOVEL))
            .unlockedBy("has_iron_axe", this.has(Items.IRON_AXE))
            .unlockedBy("has_iron_hoe", this.has(Items.IRON_HOE))
            .unlockedBy("has_iron_sword", this.has(Items.IRON_SWORD))
            .unlockedBy("has_iron_helmet", this.has(Items.IRON_HELMET))
            .unlockedBy("has_iron_chestplate", this.has(Items.IRON_CHESTPLATE))
            .unlockedBy("has_iron_leggings", this.has(Items.IRON_LEGGINGS))
            .unlockedBy("has_iron_boots", this.has(Items.IRON_BOOTS))
            .unlockedBy("has_iron_horse_armor", this.has(Items.IRON_HORSE_ARMOR))
            .unlockedBy("has_chainmail_helmet", this.has(Items.CHAINMAIL_HELMET))
            .unlockedBy("has_chainmail_chestplate", this.has(Items.CHAINMAIL_CHESTPLATE))
            .unlockedBy("has_chainmail_leggings", this.has(Items.CHAINMAIL_LEGGINGS))
            .unlockedBy("has_chainmail_boots", this.has(Items.CHAINMAIL_BOOTS))
            .save(this.output, getSmeltingRecipeName(Items.IRON_NUGGET));
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.CLAY), RecipeCategory.BUILDING_BLOCKS, Blocks.TERRACOTTA.asItem(), 0.35F, 200)
            .unlockedBy("has_clay_block", this.has(Blocks.CLAY))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.NETHERRACK), RecipeCategory.MISC, Items.NETHER_BRICK, 0.1F, 200)
            .unlockedBy("has_netherrack", this.has(Blocks.NETHERRACK))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Items.RESIN_CLUMP), RecipeCategory.MISC, Items.RESIN_BRICK, 0.1F, 200)
            .unlockedBy("has_resin_clump", this.has(Blocks.RESIN_CLUMP))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.NETHER_QUARTZ_ORE), RecipeCategory.MISC, Items.QUARTZ, 0.2F, 200)
            .unlockedBy("has_nether_quartz_ore", this.has(Blocks.NETHER_QUARTZ_ORE))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.WET_SPONGE), RecipeCategory.BUILDING_BLOCKS, Blocks.SPONGE.asItem(), 0.15F, 200)
            .unlockedBy("has_wet_sponge", this.has(Blocks.WET_SPONGE))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.COBBLESTONE), RecipeCategory.BUILDING_BLOCKS, Blocks.STONE.asItem(), 0.1F, 200)
            .unlockedBy("has_cobblestone", this.has(Blocks.COBBLESTONE))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.STONE), RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_STONE.asItem(), 0.1F, 200)
            .unlockedBy("has_stone", this.has(Blocks.STONE))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.SANDSTONE), RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_SANDSTONE.asItem(), 0.1F, 200)
            .unlockedBy("has_sandstone", this.has(Blocks.SANDSTONE))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.RED_SANDSTONE), RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_RED_SANDSTONE.asItem(), 0.1F, 200)
            .unlockedBy("has_red_sandstone", this.has(Blocks.RED_SANDSTONE))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.QUARTZ_BLOCK), RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_QUARTZ.asItem(), 0.1F, 200)
            .unlockedBy("has_quartz_block", this.has(Blocks.QUARTZ_BLOCK))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.STONE_BRICKS), RecipeCategory.BUILDING_BLOCKS, Blocks.CRACKED_STONE_BRICKS.asItem(), 0.1F, 200)
            .unlockedBy("has_stone_bricks", this.has(Blocks.STONE_BRICKS))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.BLACK_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.BLACK_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_black_terracotta", this.has(Blocks.BLACK_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.BLUE_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.BLUE_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_blue_terracotta", this.has(Blocks.BLUE_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.BROWN_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.BROWN_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_brown_terracotta", this.has(Blocks.BROWN_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.CYAN_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.CYAN_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_cyan_terracotta", this.has(Blocks.CYAN_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.GRAY_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.GRAY_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_gray_terracotta", this.has(Blocks.GRAY_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.GREEN_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.GREEN_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_green_terracotta", this.has(Blocks.GREEN_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.LIGHT_BLUE_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.LIGHT_BLUE_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_light_blue_terracotta", this.has(Blocks.LIGHT_BLUE_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.LIGHT_GRAY_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.LIGHT_GRAY_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_light_gray_terracotta", this.has(Blocks.LIGHT_GRAY_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.LIME_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.LIME_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_lime_terracotta", this.has(Blocks.LIME_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.MAGENTA_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.MAGENTA_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_magenta_terracotta", this.has(Blocks.MAGENTA_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.ORANGE_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.ORANGE_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_orange_terracotta", this.has(Blocks.ORANGE_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.PINK_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.PINK_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_pink_terracotta", this.has(Blocks.PINK_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.PURPLE_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.PURPLE_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_purple_terracotta", this.has(Blocks.PURPLE_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.RED_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.RED_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_red_terracotta", this.has(Blocks.RED_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.WHITE_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.WHITE_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_white_terracotta", this.has(Blocks.WHITE_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.YELLOW_TERRACOTTA), RecipeCategory.DECORATIONS, Blocks.YELLOW_GLAZED_TERRACOTTA.asItem(), 0.1F, 200)
            .unlockedBy("has_yellow_terracotta", this.has(Blocks.YELLOW_TERRACOTTA))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.ANCIENT_DEBRIS), RecipeCategory.MISC, Items.NETHERITE_SCRAP, 2.0F, 200)
            .unlockedBy("has_ancient_debris", this.has(Blocks.ANCIENT_DEBRIS))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.BASALT), RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_BASALT, 0.1F, 200)
            .unlockedBy("has_basalt", this.has(Blocks.BASALT))
            .save(this.output);
        SimpleCookingRecipeBuilder.smelting(Ingredient.of(Blocks.COBBLED_DEEPSLATE), RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE, 0.1F, 200)
            .unlockedBy("has_cobbled_deepslate", this.has(Blocks.COBBLED_DEEPSLATE))
            .save(this.output);
        this.oreBlasting(COAL_SMELTABLES, RecipeCategory.MISC, Items.COAL, 0.1F, 100, "coal");
        this.oreBlasting(IRON_SMELTABLES, RecipeCategory.MISC, Items.IRON_INGOT, 0.7F, 100, "iron_ingot");
        this.oreBlasting(COPPER_SMELTABLES, RecipeCategory.MISC, Items.COPPER_INGOT, 0.7F, 100, "copper_ingot");
        this.oreBlasting(GOLD_SMELTABLES, RecipeCategory.MISC, Items.GOLD_INGOT, 1.0F, 100, "gold_ingot");
        this.oreBlasting(DIAMOND_SMELTABLES, RecipeCategory.MISC, Items.DIAMOND, 1.0F, 100, "diamond");
        this.oreBlasting(LAPIS_SMELTABLES, RecipeCategory.MISC, Items.LAPIS_LAZULI, 0.2F, 100, "lapis_lazuli");
        this.oreBlasting(REDSTONE_SMELTABLES, RecipeCategory.REDSTONE, Items.REDSTONE, 0.7F, 100, "redstone");
        this.oreBlasting(EMERALD_SMELTABLES, RecipeCategory.MISC, Items.EMERALD, 1.0F, 100, "emerald");
        SimpleCookingRecipeBuilder.blasting(Ingredient.of(Blocks.NETHER_QUARTZ_ORE), RecipeCategory.MISC, Items.QUARTZ, 0.2F, 100)
            .unlockedBy("has_nether_quartz_ore", this.has(Blocks.NETHER_QUARTZ_ORE))
            .save(this.output, getBlastingRecipeName(Items.QUARTZ));
        SimpleCookingRecipeBuilder.blasting(
                Ingredient.of(
                    Items.GOLDEN_PICKAXE,
                    Items.GOLDEN_SHOVEL,
                    Items.GOLDEN_AXE,
                    Items.GOLDEN_HOE,
                    Items.GOLDEN_SWORD,
                    Items.GOLDEN_HELMET,
                    Items.GOLDEN_CHESTPLATE,
                    Items.GOLDEN_LEGGINGS,
                    Items.GOLDEN_BOOTS,
                    Items.GOLDEN_HORSE_ARMOR
                ),
                RecipeCategory.MISC,
                Items.GOLD_NUGGET,
                0.1F,
                100
            )
            .unlockedBy("has_golden_pickaxe", this.has(Items.GOLDEN_PICKAXE))
            .unlockedBy("has_golden_shovel", this.has(Items.GOLDEN_SHOVEL))
            .unlockedBy("has_golden_axe", this.has(Items.GOLDEN_AXE))
            .unlockedBy("has_golden_hoe", this.has(Items.GOLDEN_HOE))
            .unlockedBy("has_golden_sword", this.has(Items.GOLDEN_SWORD))
            .unlockedBy("has_golden_helmet", this.has(Items.GOLDEN_HELMET))
            .unlockedBy("has_golden_chestplate", this.has(Items.GOLDEN_CHESTPLATE))
            .unlockedBy("has_golden_leggings", this.has(Items.GOLDEN_LEGGINGS))
            .unlockedBy("has_golden_boots", this.has(Items.GOLDEN_BOOTS))
            .unlockedBy("has_golden_horse_armor", this.has(Items.GOLDEN_HORSE_ARMOR))
            .save(this.output, getBlastingRecipeName(Items.GOLD_NUGGET));
        SimpleCookingRecipeBuilder.blasting(
                Ingredient.of(
                    Items.IRON_PICKAXE,
                    Items.IRON_SHOVEL,
                    Items.IRON_AXE,
                    Items.IRON_HOE,
                    Items.IRON_SWORD,
                    Items.IRON_HELMET,
                    Items.IRON_CHESTPLATE,
                    Items.IRON_LEGGINGS,
                    Items.IRON_BOOTS,
                    Items.IRON_HORSE_ARMOR,
                    Items.CHAINMAIL_HELMET,
                    Items.CHAINMAIL_CHESTPLATE,
                    Items.CHAINMAIL_LEGGINGS,
                    Items.CHAINMAIL_BOOTS
                ),
                RecipeCategory.MISC,
                Items.IRON_NUGGET,
                0.1F,
                100
            )
            .unlockedBy("has_iron_pickaxe", this.has(Items.IRON_PICKAXE))
            .unlockedBy("has_iron_shovel", this.has(Items.IRON_SHOVEL))
            .unlockedBy("has_iron_axe", this.has(Items.IRON_AXE))
            .unlockedBy("has_iron_hoe", this.has(Items.IRON_HOE))
            .unlockedBy("has_iron_sword", this.has(Items.IRON_SWORD))
            .unlockedBy("has_iron_helmet", this.has(Items.IRON_HELMET))
            .unlockedBy("has_iron_chestplate", this.has(Items.IRON_CHESTPLATE))
            .unlockedBy("has_iron_leggings", this.has(Items.IRON_LEGGINGS))
            .unlockedBy("has_iron_boots", this.has(Items.IRON_BOOTS))
            .unlockedBy("has_iron_horse_armor", this.has(Items.IRON_HORSE_ARMOR))
            .unlockedBy("has_chainmail_helmet", this.has(Items.CHAINMAIL_HELMET))
            .unlockedBy("has_chainmail_chestplate", this.has(Items.CHAINMAIL_CHESTPLATE))
            .unlockedBy("has_chainmail_leggings", this.has(Items.CHAINMAIL_LEGGINGS))
            .unlockedBy("has_chainmail_boots", this.has(Items.CHAINMAIL_BOOTS))
            .save(this.output, getBlastingRecipeName(Items.IRON_NUGGET));
        SimpleCookingRecipeBuilder.blasting(Ingredient.of(Blocks.ANCIENT_DEBRIS), RecipeCategory.MISC, Items.NETHERITE_SCRAP, 2.0F, 100)
            .unlockedBy("has_ancient_debris", this.has(Blocks.ANCIENT_DEBRIS))
            .save(this.output, getBlastingRecipeName(Items.NETHERITE_SCRAP));
        this.cookRecipes("smoking", RecipeSerializer.SMOKING_RECIPE, SmokingRecipe::new, 100);
        this.cookRecipes("campfire_cooking", RecipeSerializer.CAMPFIRE_COOKING_RECIPE, CampfireCookingRecipe::new, 600);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.STONE_SLAB, Blocks.STONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.STONE_STAIRS, Blocks.STONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.STONE_BRICKS, Blocks.STONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.STONE_BRICK_SLAB, Blocks.STONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.STONE_BRICK_STAIRS, Blocks.STONE);
        SingleItemRecipeBuilder.stonecutting(Ingredient.of(Blocks.STONE), RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_STONE_BRICKS)
            .unlockedBy("has_stone", this.has(Blocks.STONE))
            .save(this.output, "chiseled_stone_bricks_stone_from_stonecutting");
        SingleItemRecipeBuilder.stonecutting(Ingredient.of(Blocks.STONE), RecipeCategory.DECORATIONS, Blocks.STONE_BRICK_WALL)
            .unlockedBy("has_stone", this.has(Blocks.STONE))
            .save(this.output, "stone_brick_walls_from_stone_stonecutting");
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_SANDSTONE, Blocks.SANDSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.SANDSTONE_SLAB, Blocks.SANDSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_SANDSTONE_SLAB, Blocks.SANDSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_SANDSTONE_SLAB, Blocks.CUT_SANDSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.SANDSTONE_STAIRS, Blocks.SANDSTONE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.SANDSTONE_WALL, Blocks.SANDSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_SANDSTONE, Blocks.SANDSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_RED_SANDSTONE, Blocks.RED_SANDSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.RED_SANDSTONE_SLAB, Blocks.RED_SANDSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_RED_SANDSTONE_SLAB, Blocks.RED_SANDSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_RED_SANDSTONE_SLAB, Blocks.CUT_RED_SANDSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.RED_SANDSTONE_STAIRS, Blocks.RED_SANDSTONE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.RED_SANDSTONE_WALL, Blocks.RED_SANDSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_RED_SANDSTONE, Blocks.RED_SANDSTONE);
        SingleItemRecipeBuilder.stonecutting(Ingredient.of(Blocks.QUARTZ_BLOCK), RecipeCategory.BUILDING_BLOCKS, Blocks.QUARTZ_SLAB, 2)
            .unlockedBy("has_quartz_block", this.has(Blocks.QUARTZ_BLOCK))
            .save(this.output, "quartz_slab_from_stonecutting");
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.QUARTZ_STAIRS, Blocks.QUARTZ_BLOCK);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.QUARTZ_PILLAR, Blocks.QUARTZ_BLOCK);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_QUARTZ_BLOCK, Blocks.QUARTZ_BLOCK);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.QUARTZ_BRICKS, Blocks.QUARTZ_BLOCK);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.COBBLESTONE_STAIRS, Blocks.COBBLESTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.COBBLESTONE_SLAB, Blocks.COBBLESTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.COBBLESTONE_WALL, Blocks.COBBLESTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.STONE_BRICK_SLAB, Blocks.STONE_BRICKS, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.STONE_BRICK_STAIRS, Blocks.STONE_BRICKS);
        SingleItemRecipeBuilder.stonecutting(Ingredient.of(Blocks.STONE_BRICKS), RecipeCategory.DECORATIONS, Blocks.STONE_BRICK_WALL)
            .unlockedBy("has_stone_bricks", this.has(Blocks.STONE_BRICKS))
            .save(this.output, "stone_brick_wall_from_stone_bricks_stonecutting");
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_STONE_BRICKS, Blocks.STONE_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.BRICK_SLAB, Blocks.BRICKS, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.BRICK_STAIRS, Blocks.BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.BRICK_WALL, Blocks.BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.MUD_BRICK_SLAB, Blocks.MUD_BRICKS, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.MUD_BRICK_STAIRS, Blocks.MUD_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.MUD_BRICK_WALL, Blocks.MUD_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.NETHER_BRICK_SLAB, Blocks.NETHER_BRICKS, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.NETHER_BRICK_STAIRS, Blocks.NETHER_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.NETHER_BRICK_WALL, Blocks.NETHER_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_NETHER_BRICKS, Blocks.NETHER_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.RESIN_BRICK_SLAB, Blocks.RESIN_BRICKS, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.RESIN_BRICK_STAIRS, Blocks.RESIN_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.RESIN_BRICK_WALL, Blocks.RESIN_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_RESIN_BRICKS, Blocks.RESIN_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.RED_NETHER_BRICK_SLAB, Blocks.RED_NETHER_BRICKS, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.RED_NETHER_BRICK_STAIRS, Blocks.RED_NETHER_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.RED_NETHER_BRICK_WALL, Blocks.RED_NETHER_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.PURPUR_SLAB, Blocks.PURPUR_BLOCK, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.PURPUR_STAIRS, Blocks.PURPUR_BLOCK);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.PURPUR_PILLAR, Blocks.PURPUR_BLOCK);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.PRISMARINE_SLAB, Blocks.PRISMARINE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.PRISMARINE_STAIRS, Blocks.PRISMARINE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.PRISMARINE_WALL, Blocks.PRISMARINE);
        SingleItemRecipeBuilder.stonecutting(Ingredient.of(Blocks.PRISMARINE_BRICKS), RecipeCategory.BUILDING_BLOCKS, Blocks.PRISMARINE_BRICK_SLAB, 2)
            .unlockedBy("has_prismarine_brick", this.has(Blocks.PRISMARINE_BRICKS))
            .save(this.output, "prismarine_brick_slab_from_prismarine_stonecutting");
        SingleItemRecipeBuilder.stonecutting(Ingredient.of(Blocks.PRISMARINE_BRICKS), RecipeCategory.BUILDING_BLOCKS, Blocks.PRISMARINE_BRICK_STAIRS)
            .unlockedBy("has_prismarine_brick", this.has(Blocks.PRISMARINE_BRICKS))
            .save(this.output, "prismarine_brick_stairs_from_prismarine_stonecutting");
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DARK_PRISMARINE_SLAB, Blocks.DARK_PRISMARINE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DARK_PRISMARINE_STAIRS, Blocks.DARK_PRISMARINE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.ANDESITE_SLAB, Blocks.ANDESITE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.ANDESITE_STAIRS, Blocks.ANDESITE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.ANDESITE_WALL, Blocks.ANDESITE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_ANDESITE, Blocks.ANDESITE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_ANDESITE_SLAB, Blocks.ANDESITE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_ANDESITE_STAIRS, Blocks.ANDESITE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_ANDESITE_SLAB, Blocks.POLISHED_ANDESITE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_ANDESITE_STAIRS, Blocks.POLISHED_ANDESITE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BASALT, Blocks.BASALT);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.GRANITE_SLAB, Blocks.GRANITE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.GRANITE_STAIRS, Blocks.GRANITE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.GRANITE_WALL, Blocks.GRANITE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_GRANITE, Blocks.GRANITE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_GRANITE_SLAB, Blocks.GRANITE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_GRANITE_STAIRS, Blocks.GRANITE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_GRANITE_SLAB, Blocks.POLISHED_GRANITE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_GRANITE_STAIRS, Blocks.POLISHED_GRANITE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DIORITE_SLAB, Blocks.DIORITE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DIORITE_STAIRS, Blocks.DIORITE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.DIORITE_WALL, Blocks.DIORITE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_DIORITE, Blocks.DIORITE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_DIORITE_SLAB, Blocks.DIORITE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_DIORITE_STAIRS, Blocks.DIORITE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_DIORITE_SLAB, Blocks.POLISHED_DIORITE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_DIORITE_STAIRS, Blocks.POLISHED_DIORITE);
        SingleItemRecipeBuilder.stonecutting(Ingredient.of(Blocks.MOSSY_STONE_BRICKS), RecipeCategory.BUILDING_BLOCKS, Blocks.MOSSY_STONE_BRICK_SLAB, 2)
            .unlockedBy("has_mossy_stone_bricks", this.has(Blocks.MOSSY_STONE_BRICKS))
            .save(this.output, "mossy_stone_brick_slab_from_mossy_stone_brick_stonecutting");
        SingleItemRecipeBuilder.stonecutting(Ingredient.of(Blocks.MOSSY_STONE_BRICKS), RecipeCategory.BUILDING_BLOCKS, Blocks.MOSSY_STONE_BRICK_STAIRS)
            .unlockedBy("has_mossy_stone_bricks", this.has(Blocks.MOSSY_STONE_BRICKS))
            .save(this.output, "mossy_stone_brick_stairs_from_mossy_stone_brick_stonecutting");
        SingleItemRecipeBuilder.stonecutting(Ingredient.of(Blocks.MOSSY_STONE_BRICKS), RecipeCategory.DECORATIONS, Blocks.MOSSY_STONE_BRICK_WALL)
            .unlockedBy("has_mossy_stone_bricks", this.has(Blocks.MOSSY_STONE_BRICKS))
            .save(this.output, "mossy_stone_brick_wall_from_mossy_stone_brick_stonecutting");
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.MOSSY_COBBLESTONE_SLAB, Blocks.MOSSY_COBBLESTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.MOSSY_COBBLESTONE_STAIRS, Blocks.MOSSY_COBBLESTONE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.MOSSY_COBBLESTONE_WALL, Blocks.MOSSY_COBBLESTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_SANDSTONE_SLAB, Blocks.SMOOTH_SANDSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_SANDSTONE_STAIRS, Blocks.SMOOTH_SANDSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_RED_SANDSTONE_SLAB, Blocks.SMOOTH_RED_SANDSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_RED_SANDSTONE_STAIRS, Blocks.SMOOTH_RED_SANDSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_QUARTZ_SLAB, Blocks.SMOOTH_QUARTZ, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_QUARTZ_STAIRS, Blocks.SMOOTH_QUARTZ);
        SingleItemRecipeBuilder.stonecutting(Ingredient.of(Blocks.END_STONE_BRICKS), RecipeCategory.BUILDING_BLOCKS, Blocks.END_STONE_BRICK_SLAB, 2)
            .unlockedBy("has_end_stone_brick", this.has(Blocks.END_STONE_BRICKS))
            .save(this.output, "end_stone_brick_slab_from_end_stone_brick_stonecutting");
        SingleItemRecipeBuilder.stonecutting(Ingredient.of(Blocks.END_STONE_BRICKS), RecipeCategory.BUILDING_BLOCKS, Blocks.END_STONE_BRICK_STAIRS)
            .unlockedBy("has_end_stone_brick", this.has(Blocks.END_STONE_BRICKS))
            .save(this.output, "end_stone_brick_stairs_from_end_stone_brick_stonecutting");
        SingleItemRecipeBuilder.stonecutting(Ingredient.of(Blocks.END_STONE_BRICKS), RecipeCategory.DECORATIONS, Blocks.END_STONE_BRICK_WALL)
            .unlockedBy("has_end_stone_brick", this.has(Blocks.END_STONE_BRICKS))
            .save(this.output, "end_stone_brick_wall_from_end_stone_brick_stonecutting");
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.END_STONE_BRICKS, Blocks.END_STONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.END_STONE_BRICK_SLAB, Blocks.END_STONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.END_STONE_BRICK_STAIRS, Blocks.END_STONE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.END_STONE_BRICK_WALL, Blocks.END_STONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.SMOOTH_STONE_SLAB, Blocks.SMOOTH_STONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.BLACKSTONE_SLAB, Blocks.BLACKSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.BLACKSTONE_STAIRS, Blocks.BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.BLACKSTONE_WALL, Blocks.BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE, Blocks.BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.POLISHED_BLACKSTONE_WALL, Blocks.BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE_SLAB, Blocks.BLACKSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE_STAIRS, Blocks.BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_POLISHED_BLACKSTONE, Blocks.BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE_BRICKS, Blocks.BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE_BRICK_SLAB, Blocks.BLACKSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE_BRICK_STAIRS, Blocks.BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.POLISHED_BLACKSTONE_BRICK_WALL, Blocks.BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE_SLAB, Blocks.POLISHED_BLACKSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE_STAIRS, Blocks.POLISHED_BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE_BRICKS, Blocks.POLISHED_BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.POLISHED_BLACKSTONE_WALL, Blocks.POLISHED_BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE_BRICK_SLAB, Blocks.POLISHED_BLACKSTONE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE_BRICK_STAIRS, Blocks.POLISHED_BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.POLISHED_BLACKSTONE_BRICK_WALL, Blocks.POLISHED_BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_POLISHED_BLACKSTONE, Blocks.POLISHED_BLACKSTONE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE_BRICK_SLAB, Blocks.POLISHED_BLACKSTONE_BRICKS, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_BLACKSTONE_BRICK_STAIRS, Blocks.POLISHED_BLACKSTONE_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.POLISHED_BLACKSTONE_BRICK_WALL, Blocks.POLISHED_BLACKSTONE_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_COPPER_SLAB, Blocks.CUT_COPPER, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_COPPER_STAIRS, Blocks.CUT_COPPER);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.EXPOSED_CUT_COPPER_SLAB, Blocks.EXPOSED_CUT_COPPER, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.EXPOSED_CUT_COPPER_STAIRS, Blocks.EXPOSED_CUT_COPPER);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WEATHERED_CUT_COPPER_SLAB, Blocks.WEATHERED_CUT_COPPER, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WEATHERED_CUT_COPPER_STAIRS, Blocks.WEATHERED_CUT_COPPER);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.OXIDIZED_CUT_COPPER_SLAB, Blocks.OXIDIZED_CUT_COPPER, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.OXIDIZED_CUT_COPPER_STAIRS, Blocks.OXIDIZED_CUT_COPPER);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_CUT_COPPER_SLAB, Blocks.WAXED_CUT_COPPER, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_CUT_COPPER_STAIRS, Blocks.WAXED_CUT_COPPER);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_EXPOSED_CUT_COPPER_SLAB, Blocks.WAXED_EXPOSED_CUT_COPPER, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_EXPOSED_CUT_COPPER_STAIRS, Blocks.WAXED_EXPOSED_CUT_COPPER);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_WEATHERED_CUT_COPPER_SLAB, Blocks.WAXED_WEATHERED_CUT_COPPER, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_WEATHERED_CUT_COPPER_STAIRS, Blocks.WAXED_WEATHERED_CUT_COPPER);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_OXIDIZED_CUT_COPPER_SLAB, Blocks.WAXED_OXIDIZED_CUT_COPPER, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_OXIDIZED_CUT_COPPER_STAIRS, Blocks.WAXED_OXIDIZED_CUT_COPPER);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_COPPER, Blocks.COPPER_BLOCK, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_COPPER_STAIRS, Blocks.COPPER_BLOCK, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CUT_COPPER_SLAB, Blocks.COPPER_BLOCK, 8);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.EXPOSED_CUT_COPPER, Blocks.EXPOSED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.EXPOSED_CUT_COPPER_STAIRS, Blocks.EXPOSED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.EXPOSED_CUT_COPPER_SLAB, Blocks.EXPOSED_COPPER, 8);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WEATHERED_CUT_COPPER, Blocks.WEATHERED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WEATHERED_CUT_COPPER_STAIRS, Blocks.WEATHERED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WEATHERED_CUT_COPPER_SLAB, Blocks.WEATHERED_COPPER, 8);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.OXIDIZED_CUT_COPPER, Blocks.OXIDIZED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.OXIDIZED_CUT_COPPER_STAIRS, Blocks.OXIDIZED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.OXIDIZED_CUT_COPPER_SLAB, Blocks.OXIDIZED_COPPER, 8);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_CUT_COPPER, Blocks.WAXED_COPPER_BLOCK, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_CUT_COPPER_STAIRS, Blocks.WAXED_COPPER_BLOCK, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_CUT_COPPER_SLAB, Blocks.WAXED_COPPER_BLOCK, 8);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_EXPOSED_CUT_COPPER, Blocks.WAXED_EXPOSED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_EXPOSED_CUT_COPPER_STAIRS, Blocks.WAXED_EXPOSED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_EXPOSED_CUT_COPPER_SLAB, Blocks.WAXED_EXPOSED_COPPER, 8);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_WEATHERED_CUT_COPPER, Blocks.WAXED_WEATHERED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_WEATHERED_CUT_COPPER_STAIRS, Blocks.WAXED_WEATHERED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_WEATHERED_CUT_COPPER_SLAB, Blocks.WAXED_WEATHERED_COPPER, 8);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_OXIDIZED_CUT_COPPER, Blocks.WAXED_OXIDIZED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_OXIDIZED_CUT_COPPER_STAIRS, Blocks.WAXED_OXIDIZED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_OXIDIZED_CUT_COPPER_SLAB, Blocks.WAXED_OXIDIZED_COPPER, 8);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.COBBLED_DEEPSLATE_SLAB, Blocks.COBBLED_DEEPSLATE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.COBBLED_DEEPSLATE_STAIRS, Blocks.COBBLED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.COBBLED_DEEPSLATE_WALL, Blocks.COBBLED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_DEEPSLATE, Blocks.COBBLED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_DEEPSLATE, Blocks.COBBLED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_DEEPSLATE_SLAB, Blocks.COBBLED_DEEPSLATE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_DEEPSLATE_STAIRS, Blocks.COBBLED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.POLISHED_DEEPSLATE_WALL, Blocks.COBBLED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_BRICKS, Blocks.COBBLED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_BRICK_SLAB, Blocks.COBBLED_DEEPSLATE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_BRICK_STAIRS, Blocks.COBBLED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.DEEPSLATE_BRICK_WALL, Blocks.COBBLED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_TILES, Blocks.COBBLED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_TILE_SLAB, Blocks.COBBLED_DEEPSLATE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_TILE_STAIRS, Blocks.COBBLED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.DEEPSLATE_TILE_WALL, Blocks.COBBLED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_DEEPSLATE_SLAB, Blocks.POLISHED_DEEPSLATE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_DEEPSLATE_STAIRS, Blocks.POLISHED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.POLISHED_DEEPSLATE_WALL, Blocks.POLISHED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_BRICKS, Blocks.POLISHED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_BRICK_SLAB, Blocks.POLISHED_DEEPSLATE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_BRICK_STAIRS, Blocks.POLISHED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.DEEPSLATE_BRICK_WALL, Blocks.POLISHED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_TILES, Blocks.POLISHED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_TILE_SLAB, Blocks.POLISHED_DEEPSLATE, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_TILE_STAIRS, Blocks.POLISHED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.DEEPSLATE_TILE_WALL, Blocks.POLISHED_DEEPSLATE);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_BRICK_SLAB, Blocks.DEEPSLATE_BRICKS, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_BRICK_STAIRS, Blocks.DEEPSLATE_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.DEEPSLATE_BRICK_WALL, Blocks.DEEPSLATE_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_TILES, Blocks.DEEPSLATE_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_TILE_SLAB, Blocks.DEEPSLATE_BRICKS, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_TILE_STAIRS, Blocks.DEEPSLATE_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.DEEPSLATE_TILE_WALL, Blocks.DEEPSLATE_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_TILE_SLAB, Blocks.DEEPSLATE_TILES, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.DEEPSLATE_TILE_STAIRS, Blocks.DEEPSLATE_TILES);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.DEEPSLATE_TILE_WALL, Blocks.DEEPSLATE_TILES);
        smithingTrims().forEach(p_358454_ -> this.trimSmithing(p_358454_.template(), p_358454_.id()));
        this.netheriteSmithing(Items.DIAMOND_CHESTPLATE, RecipeCategory.COMBAT, Items.NETHERITE_CHESTPLATE);
        this.netheriteSmithing(Items.DIAMOND_LEGGINGS, RecipeCategory.COMBAT, Items.NETHERITE_LEGGINGS);
        this.netheriteSmithing(Items.DIAMOND_HELMET, RecipeCategory.COMBAT, Items.NETHERITE_HELMET);
        this.netheriteSmithing(Items.DIAMOND_BOOTS, RecipeCategory.COMBAT, Items.NETHERITE_BOOTS);
        this.netheriteSmithing(Items.DIAMOND_SWORD, RecipeCategory.COMBAT, Items.NETHERITE_SWORD);
        this.netheriteSmithing(Items.DIAMOND_AXE, RecipeCategory.TOOLS, Items.NETHERITE_AXE);
        this.netheriteSmithing(Items.DIAMOND_PICKAXE, RecipeCategory.TOOLS, Items.NETHERITE_PICKAXE);
        this.netheriteSmithing(Items.DIAMOND_HOE, RecipeCategory.TOOLS, Items.NETHERITE_HOE);
        this.netheriteSmithing(Items.DIAMOND_SHOVEL, RecipeCategory.TOOLS, Items.NETHERITE_SHOVEL);
        this.copySmithingTemplate(Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE, Items.NETHERRACK);
        this.copySmithingTemplate(Items.SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE, Items.COBBLESTONE);
        this.copySmithingTemplate(Items.DUNE_ARMOR_TRIM_SMITHING_TEMPLATE, Items.SANDSTONE);
        this.copySmithingTemplate(Items.COAST_ARMOR_TRIM_SMITHING_TEMPLATE, Items.COBBLESTONE);
        this.copySmithingTemplate(Items.WILD_ARMOR_TRIM_SMITHING_TEMPLATE, Items.MOSSY_COBBLESTONE);
        this.copySmithingTemplate(Items.WARD_ARMOR_TRIM_SMITHING_TEMPLATE, Items.COBBLED_DEEPSLATE);
        this.copySmithingTemplate(Items.EYE_ARMOR_TRIM_SMITHING_TEMPLATE, Items.END_STONE);
        this.copySmithingTemplate(Items.VEX_ARMOR_TRIM_SMITHING_TEMPLATE, Items.COBBLESTONE);
        this.copySmithingTemplate(Items.TIDE_ARMOR_TRIM_SMITHING_TEMPLATE, Items.PRISMARINE);
        this.copySmithingTemplate(Items.SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE, Items.BLACKSTONE);
        this.copySmithingTemplate(Items.RIB_ARMOR_TRIM_SMITHING_TEMPLATE, Items.NETHERRACK);
        this.copySmithingTemplate(Items.SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE, Items.PURPUR_BLOCK);
        this.copySmithingTemplate(Items.SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE, Items.COBBLED_DEEPSLATE);
        this.copySmithingTemplate(Items.WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE, Items.TERRACOTTA);
        this.copySmithingTemplate(Items.SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE, Items.TERRACOTTA);
        this.copySmithingTemplate(Items.RAISER_ARMOR_TRIM_SMITHING_TEMPLATE, Items.TERRACOTTA);
        this.copySmithingTemplate(Items.HOST_ARMOR_TRIM_SMITHING_TEMPLATE, Items.TERRACOTTA);
        this.copySmithingTemplate(Items.FLOW_ARMOR_TRIM_SMITHING_TEMPLATE, Items.BREEZE_ROD);
        this.copySmithingTemplate(Items.BOLT_ARMOR_TRIM_SMITHING_TEMPLATE, Ingredient.of(Items.COPPER_BLOCK, Items.WAXED_COPPER_BLOCK));
        this.threeByThreePacker(RecipeCategory.BUILDING_BLOCKS, Blocks.BAMBOO_BLOCK, Items.BAMBOO);
        this.planksFromLogs(Blocks.BAMBOO_PLANKS, ItemTags.BAMBOO_BLOCKS, 2);
        this.mosaicBuilder(RecipeCategory.DECORATIONS, Blocks.BAMBOO_MOSAIC, Blocks.BAMBOO_SLAB);
        this.woodenBoat(Items.BAMBOO_RAFT, Blocks.BAMBOO_PLANKS);
        this.chestBoat(Items.BAMBOO_CHEST_RAFT, Items.BAMBOO_RAFT);
        this.hangingSign(Items.OAK_HANGING_SIGN, Blocks.STRIPPED_OAK_LOG);
        this.hangingSign(Items.SPRUCE_HANGING_SIGN, Blocks.STRIPPED_SPRUCE_LOG);
        this.hangingSign(Items.BIRCH_HANGING_SIGN, Blocks.STRIPPED_BIRCH_LOG);
        this.hangingSign(Items.JUNGLE_HANGING_SIGN, Blocks.STRIPPED_JUNGLE_LOG);
        this.hangingSign(Items.ACACIA_HANGING_SIGN, Blocks.STRIPPED_ACACIA_LOG);
        this.hangingSign(Items.CHERRY_HANGING_SIGN, Blocks.STRIPPED_CHERRY_LOG);
        this.hangingSign(Items.DARK_OAK_HANGING_SIGN, Blocks.STRIPPED_DARK_OAK_LOG);
        this.hangingSign(Items.PALE_OAK_HANGING_SIGN, Blocks.STRIPPED_PALE_OAK_LOG);
        this.hangingSign(Items.MANGROVE_HANGING_SIGN, Blocks.STRIPPED_MANGROVE_LOG);
        this.hangingSign(Items.BAMBOO_HANGING_SIGN, Items.STRIPPED_BAMBOO_BLOCK);
        this.hangingSign(Items.CRIMSON_HANGING_SIGN, Blocks.STRIPPED_CRIMSON_STEM);
        this.hangingSign(Items.WARPED_HANGING_SIGN, Blocks.STRIPPED_WARPED_STEM);
        this.shaped(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_BOOKSHELF)
            .define('#', ItemTags.PLANKS)
            .define('X', ItemTags.WOODEN_SLABS)
            .pattern("###")
            .pattern("XXX")
            .pattern("###")
            .unlockedBy("has_book", this.has(Items.BOOK))
            .save(this.output);
        this.oneToOneConversionRecipe(Items.ORANGE_DYE, Blocks.TORCHFLOWER, "orange_dye");
        this.oneToOneConversionRecipe(Items.CYAN_DYE, Blocks.PITCHER_PLANT, "cyan_dye", 2);
        this.planksFromLog(Blocks.CHERRY_PLANKS, ItemTags.CHERRY_LOGS, 4);
        this.woodFromLogs(Blocks.CHERRY_WOOD, Blocks.CHERRY_LOG);
        this.woodFromLogs(Blocks.STRIPPED_CHERRY_WOOD, Blocks.STRIPPED_CHERRY_LOG);
        this.woodenBoat(Items.CHERRY_BOAT, Blocks.CHERRY_PLANKS);
        this.chestBoat(Items.CHERRY_CHEST_BOAT, Items.CHERRY_BOAT);
        this.oneToOneConversionRecipe(Items.PINK_DYE, Items.PINK_PETALS, "pink_dye", 1);
        this.shaped(RecipeCategory.TOOLS, Items.BRUSH)
            .define('X', Items.FEATHER)
            .define('#', Items.COPPER_INGOT)
            .define('I', Items.STICK)
            .pattern("X")
            .pattern("#")
            .pattern("I")
            .unlockedBy("has_copper_ingot", this.has(Items.COPPER_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.DECORATIONS, Items.DECORATED_POT)
            .define('#', Items.BRICK)
            .pattern(" # ")
            .pattern("# #")
            .pattern(" # ")
            .unlockedBy("has_brick", this.has(ItemTags.DECORATED_POT_INGREDIENTS))
            .save(this.output, "decorated_pot_simple");
        SpecialRecipeBuilder.special(DecoratedPotRecipe::new).save(this.output, "decorated_pot");
        this.shaped(RecipeCategory.REDSTONE, Blocks.CRAFTER)
            .define('#', Items.IRON_INGOT)
            .define('C', Items.CRAFTING_TABLE)
            .define('R', Items.REDSTONE)
            .define('D', Items.DROPPER)
            .pattern("###")
            .pattern("#C#")
            .pattern("RDR")
            .unlockedBy("has_dropper", this.has(Items.DROPPER))
            .save(this.output);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.TUFF_SLAB, Blocks.TUFF, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.TUFF_STAIRS, Blocks.TUFF);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.TUFF_WALL, Blocks.TUFF);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_TUFF, Blocks.TUFF);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_TUFF, Blocks.TUFF);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_TUFF_SLAB, Blocks.TUFF, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_TUFF_STAIRS, Blocks.TUFF);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.POLISHED_TUFF_WALL, Blocks.TUFF);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.TUFF_BRICKS, Blocks.TUFF);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.TUFF_BRICK_SLAB, Blocks.TUFF, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.TUFF_BRICK_STAIRS, Blocks.TUFF);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.TUFF_BRICK_WALL, Blocks.TUFF);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_TUFF_BRICKS, Blocks.TUFF);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_TUFF_SLAB, Blocks.POLISHED_TUFF, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.POLISHED_TUFF_STAIRS, Blocks.POLISHED_TUFF);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.POLISHED_TUFF_WALL, Blocks.POLISHED_TUFF);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.TUFF_BRICKS, Blocks.POLISHED_TUFF);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.TUFF_BRICK_SLAB, Blocks.POLISHED_TUFF, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.TUFF_BRICK_STAIRS, Blocks.POLISHED_TUFF);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.TUFF_BRICK_WALL, Blocks.POLISHED_TUFF);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_TUFF_BRICKS, Blocks.POLISHED_TUFF);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.TUFF_BRICK_SLAB, Blocks.TUFF_BRICKS, 2);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.TUFF_BRICK_STAIRS, Blocks.TUFF_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.DECORATIONS, Blocks.TUFF_BRICK_WALL, Blocks.TUFF_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_TUFF_BRICKS, Blocks.TUFF_BRICKS);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_COPPER, Blocks.COPPER_BLOCK, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.EXPOSED_CHISELED_COPPER, Blocks.EXPOSED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WEATHERED_CHISELED_COPPER, Blocks.WEATHERED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.OXIDIZED_CHISELED_COPPER, Blocks.OXIDIZED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_CHISELED_COPPER, Blocks.WAXED_COPPER_BLOCK, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_EXPOSED_CHISELED_COPPER, Blocks.WAXED_EXPOSED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_WEATHERED_CHISELED_COPPER, Blocks.WAXED_WEATHERED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_OXIDIZED_CHISELED_COPPER, Blocks.WAXED_OXIDIZED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.CHISELED_COPPER, Blocks.CUT_COPPER, 1);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.EXPOSED_CHISELED_COPPER, Blocks.EXPOSED_CUT_COPPER, 1);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WEATHERED_CHISELED_COPPER, Blocks.WEATHERED_CUT_COPPER, 1);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.OXIDIZED_CHISELED_COPPER, Blocks.OXIDIZED_CUT_COPPER, 1);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_CHISELED_COPPER, Blocks.WAXED_CUT_COPPER, 1);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_EXPOSED_CHISELED_COPPER, Blocks.WAXED_EXPOSED_CUT_COPPER, 1);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_WEATHERED_CHISELED_COPPER, Blocks.WAXED_WEATHERED_CUT_COPPER, 1);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_OXIDIZED_CHISELED_COPPER, Blocks.WAXED_OXIDIZED_CUT_COPPER, 1);
        this.grate(Blocks.COPPER_GRATE, Blocks.COPPER_BLOCK);
        this.grate(Blocks.EXPOSED_COPPER_GRATE, Blocks.EXPOSED_COPPER);
        this.grate(Blocks.WEATHERED_COPPER_GRATE, Blocks.WEATHERED_COPPER);
        this.grate(Blocks.OXIDIZED_COPPER_GRATE, Blocks.OXIDIZED_COPPER);
        this.grate(Blocks.WAXED_COPPER_GRATE, Blocks.WAXED_COPPER_BLOCK);
        this.grate(Blocks.WAXED_EXPOSED_COPPER_GRATE, Blocks.WAXED_EXPOSED_COPPER);
        this.grate(Blocks.WAXED_WEATHERED_COPPER_GRATE, Blocks.WAXED_WEATHERED_COPPER);
        this.grate(Blocks.WAXED_OXIDIZED_COPPER_GRATE, Blocks.WAXED_OXIDIZED_COPPER);
        this.copperBulb(Blocks.COPPER_BULB, Blocks.COPPER_BLOCK);
        this.copperBulb(Blocks.EXPOSED_COPPER_BULB, Blocks.EXPOSED_COPPER);
        this.copperBulb(Blocks.WEATHERED_COPPER_BULB, Blocks.WEATHERED_COPPER);
        this.copperBulb(Blocks.OXIDIZED_COPPER_BULB, Blocks.OXIDIZED_COPPER);
        this.copperBulb(Blocks.WAXED_COPPER_BULB, Blocks.WAXED_COPPER_BLOCK);
        this.copperBulb(Blocks.WAXED_EXPOSED_COPPER_BULB, Blocks.WAXED_EXPOSED_COPPER);
        this.copperBulb(Blocks.WAXED_WEATHERED_COPPER_BULB, Blocks.WAXED_WEATHERED_COPPER);
        this.copperBulb(Blocks.WAXED_OXIDIZED_COPPER_BULB, Blocks.WAXED_OXIDIZED_COPPER);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.COPPER_GRATE, Blocks.COPPER_BLOCK, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.EXPOSED_COPPER_GRATE, Blocks.EXPOSED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WEATHERED_COPPER_GRATE, Blocks.WEATHERED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.OXIDIZED_COPPER_GRATE, Blocks.OXIDIZED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_COPPER_GRATE, Blocks.WAXED_COPPER_BLOCK, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_EXPOSED_COPPER_GRATE, Blocks.WAXED_EXPOSED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_WEATHERED_COPPER_GRATE, Blocks.WAXED_WEATHERED_COPPER, 4);
        this.stonecutterResultFromBase(RecipeCategory.BUILDING_BLOCKS, Blocks.WAXED_OXIDIZED_COPPER_GRATE, Blocks.WAXED_OXIDIZED_COPPER, 4);
        this.shapeless(RecipeCategory.MISC, Items.WIND_CHARGE, 4)
            .requires(Items.BREEZE_ROD)
            .unlockedBy("has_breeze_rod", this.has(Items.BREEZE_ROD))
            .save(this.output);
        this.shaped(RecipeCategory.COMBAT, Items.MACE, 1)
            .define('I', Items.BREEZE_ROD)
            .define('#', Blocks.HEAVY_CORE)
            .pattern(" # ")
            .pattern(" I ")
            .unlockedBy("has_breeze_rod", this.has(Items.BREEZE_ROD))
            .unlockedBy("has_heavy_core", this.has(Blocks.HEAVY_CORE))
            .save(this.output);
        this.doorBuilder(Blocks.COPPER_DOOR, Ingredient.of(Items.COPPER_INGOT))
            .unlockedBy(getHasName(Items.COPPER_INGOT), this.has(Items.COPPER_INGOT))
            .save(this.output);
        this.trapdoorBuilder(Blocks.COPPER_TRAPDOOR, Ingredient.of(Items.COPPER_INGOT))
            .unlockedBy(getHasName(Items.COPPER_INGOT), this.has(Items.COPPER_INGOT))
            .save(this.output);
        this.shaped(RecipeCategory.TOOLS, Items.BUNDLE)
            .define('-', Items.STRING)
            .define('#', Items.LEATHER)
            .pattern("-")
            .pattern("#")
            .unlockedBy("has_string", this.has(Items.STRING))
            .save(this.output);
        this.bundleRecipes();
    }

    public static Stream<VanillaRecipeProvider.TrimTemplate> smithingTrims() {
        return Stream.of(
                Items.BOLT_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.COAST_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.DUNE_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.EYE_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.FLOW_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.HOST_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.RAISER_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.RIB_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.TIDE_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.VEX_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.WARD_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE,
                Items.WILD_ARMOR_TRIM_SMITHING_TEMPLATE
            )
            .map(
                p_358455_ -> new VanillaRecipeProvider.TrimTemplate(
                        p_358455_, ResourceKey.create(Registries.RECIPE, ResourceLocation.withDefaultNamespace(getItemName(p_358455_) + "_smithing_trim"))
                    )
            );
    }

    private void shulkerBoxRecipes() {
        Ingredient ingredient = this.tag(ItemTags.SHULKER_BOXES);

        for (DyeColor dyecolor : DyeColor.values()) {
            TransmuteRecipeBuilder.transmute(
                    RecipeCategory.DECORATIONS, ingredient, Ingredient.of(DyeItem.byColor(dyecolor)), ShulkerBoxBlock.getBlockByColor(dyecolor).asItem()
                )
                .group("shulker_box_dye")
                .unlockedBy("has_shulker_box", this.has(ItemTags.SHULKER_BOXES))
                .save(this.output);
        }
    }

    private void bundleRecipes() {
        Ingredient ingredient = this.tag(ItemTags.BUNDLES);

        for (DyeColor dyecolor : DyeColor.values()) {
            DyeItem dyeitem = DyeItem.byColor(dyecolor);
            TransmuteRecipeBuilder.transmute(RecipeCategory.TOOLS, ingredient, Ingredient.of(dyeitem), BundleItem.getByColor(dyecolor))
                .group("bundle_dye")
                .unlockedBy(getHasName(dyeitem), this.has(dyeitem))
                .save(this.output);
        }
    }

    public static class Runner extends RecipeProvider.Runner {
        public Runner(PackOutput p_365932_, CompletableFuture<HolderLookup.Provider> p_363203_) {
            super(p_365932_, p_363203_);
        }

        @Override
        protected RecipeProvider createRecipeProvider(HolderLookup.Provider p_369764_, RecipeOutput p_363473_) {
            return new VanillaRecipeProvider(p_369764_, p_363473_);
        }

        @Override
        public String getName() {
            return "Vanilla Recipes";
        }
    }

    public static record TrimTemplate(Item template, ResourceKey<Recipe<?>> id) {
    }
}