Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
1package net.lerariemann.infinity.item.function;
2
3import net.lerariemann.infinity.item.F4Item;
4import net.lerariemann.infinity.registry.core.ModComponentTypes;
5import net.lerariemann.infinity.registry.core.ModItemFunctions;
6import net.lerariemann.infinity.registry.core.ModItems;
7import net.lerariemann.infinity.util.VersionMethods;
8
9import net.minecraft.core.NonNullList;
10import net.minecraft.core.RegistryAccess;
11//? if >1.21 {
12import net.minecraft.core.component.DataComponentMap;
13import net.minecraft.world.item.crafting.CraftingInput;
14import net.minecraft.core.HolderLookup;
15//?}
16import net.minecraft.resources.ResourceLocation;
17import net.minecraft.world.inventory.CraftingContainer;
18import net.minecraft.world.item.ItemStack;
19import net.minecraft.world.item.Items;
20import net.minecraft.world.item.crafting.CraftingBookCategory;
21import net.minecraft.world.item.crafting.CustomRecipe;
22import net.minecraft.world.item.crafting.RecipeSerializer;
23import net.minecraft.world.level.Level;
24import org.jetbrains.annotations.NotNull;
25
26public class F4RechargingRecipe extends CustomRecipe {
27 public F4RechargingRecipe(
28 //? if <1.21
29 /*ResourceLocation id,*/
30 CraftingBookCategory craftingRecipeCategory) {
31 super(
32 //? if <1.21
33 /*id,*/
34 craftingRecipeCategory);
35 }
36
37 public boolean matches(
38 //? if >1.21 {
39 CraftingInput
40 //?} else {
41 /*CraftingContainer
42 *///?}
43 craftingRecipeInput, Level world) {
44 boolean foundF4 = false;
45 //? if >1.21 {
46 int size = craftingRecipeInput.size();
47 //?} else {
48 /*int size = craftingRecipeInput.getContainerSize();
49 *///?}
50 for (int k = 0; k < size; k++) {
51 ItemStack itemStack = craftingRecipeInput.getItem(k);
52 if (itemStack.is(ModItems.F4.get())) {
53 if (foundF4) return false;
54 foundF4 = true;
55 }
56 else if (!itemStack.is(Items.OBSIDIAN)) return false;
57 }
58 return foundF4;
59 }
60
61 public @NotNull ItemStack assemble(
62 //? if >1.21 {
63 CraftingInput
64 //?} else {
65 /*CraftingContainer
66 *///?}
67 craftingRecipeInput,
68 //? if >1.21 {
69 HolderLookup.Provider
70 //?} else {
71 /*RegistryAccess
72 *///?}
73 wrapperLookup) {
74 ItemStack f4 = null;
75 int i = 0;
76 //? if >1.21 {
77 int size = craftingRecipeInput.size();
78 //?} else {
79 /*int size = craftingRecipeInput.getContainerSize();
80 *///?}
81 for (int k = 0; k < size; k++) {
82 ItemStack itemStack = craftingRecipeInput.getItem(k);
83 if (itemStack.is(ModItems.F4.get())) f4 = itemStack;
84 else if (!itemStack.isEmpty()) i++;
85 }
86 assert f4 != null;
87 int charge = F4Item.getCharge(f4);
88 if (i == 0) {
89 if (charge > 0) return Items.OBSIDIAN.getDefaultInstance().copyWithCount(Math.min(charge, 64)); //"removing obsidian" recipe
90 }
91 ItemStack result = f4.copyWithCount(1);
92 VersionMethods.apply(result, ModComponentTypes.CHARGE, charge+i);
93 if (charge + i == 0) { //"clearing data" recipe
94 VersionMethods.remove(result, ModComponentTypes.DESTINATION);
95 VersionMethods.remove(result, ModComponentTypes.COLOR);
96 }
97 return result;
98 }
99
100 @Override
101 public @NotNull NonNullList<ItemStack> getRemainingItems(
102 //? if >1.21 {
103 CraftingInput
104 //?} else {
105 /*CraftingContainer
106 *///?}
107 craftingRecipeInput) {
108 //? if >1.21 {
109 int size = craftingRecipeInput.size();
110 //?} else {
111 /*int size = craftingRecipeInput.getContainerSize();
112 *///?}
113 NonNullList<ItemStack> defaultedList = NonNullList.withSize(size, ItemStack.EMPTY);
114 ItemStack f4 = null;
115 int f4pos = 0;
116 for (int i = 0; i < defaultedList.size(); i++) {
117 ItemStack itemStack = craftingRecipeInput.getItem(i);
118 if (itemStack.is(ModItems.F4.get())) {
119 f4 = itemStack;
120 f4pos = i;
121 }
122 else if (!itemStack.isEmpty()) return defaultedList;//"adding obsidian" recipe
123 }
124 assert f4 != null;
125 int charge = F4Item.getCharge(f4);
126 if (charge == 0) return defaultedList; //"clearing data" recipe
127 charge = Math.max(charge - 64, 0);
128 ItemStack result = f4.copyWithCount(1);
129 VersionMethods.apply(result, ModComponentTypes.CHARGE, charge);
130 defaultedList.set(f4pos, result);//"adding obsidian" recipe
131 return defaultedList;
132 }
133
134 //? if <1.21.2 {
135 /*@Override
136 public boolean canCraftInDimensions(int width, int height) {
137 return width*height >= 2;
138 }
139 *///?}
140
141 @Override
142 public @NotNull RecipeSerializer<F4RechargingRecipe> getSerializer() {
143 return ModItemFunctions.F4_RECHARGING.get();
144 }
145}
146