Skip to content

Commit b742f3f

Browse files
authored
Move recycling code out of OreDictUnifier (GregTechCEu#2809)
1 parent ffe864d commit b742f3f

File tree

16 files changed

+701
-596
lines changed

16 files changed

+701
-596
lines changed

src/main/java/gregtech/api/GregTechAPI.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import gregtech.api.network.INetworkHandler;
1414
import gregtech.api.recipes.properties.RecipePropertyRegistry;
1515
import gregtech.api.sound.ISoundManager;
16+
import gregtech.api.unification.RecyclingManager;
1617
import gregtech.api.unification.material.Material;
1718
import gregtech.api.unification.material.registry.IMaterialRegistryManager;
1819
import gregtech.api.unification.material.registry.MarkerMaterialRegistry;
@@ -58,6 +59,10 @@ public class GregTechAPI {
5859
/** GT's data migrations API */
5960
public static final MigrationAPI MIGRATIONS = new MigrationAPI();
6061
public static final RecipePropertyRegistry RECIPE_PROPERTIES = new RecipePropertyRegistry();
62+
/**
63+
* Manager for Item Recycling Data
64+
*/
65+
public static final RecyclingManager RECYCLING_MANAGER = new RecyclingManager();
6166

6267
/** Will be available at the Pre-Initialization stage */
6368
private static boolean highTier;

src/main/java/gregtech/api/items/metaitem/MetaItem.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gregtech.api.items.metaitem;
22

33
import gregtech.api.GTValues;
4+
import gregtech.api.GregTechAPI;
45
import gregtech.api.capability.GregtechCapabilities;
56
import gregtech.api.capability.IElectricItem;
67
import gregtech.api.capability.IFilteredFluidContainer;
@@ -27,7 +28,7 @@
2728
import gregtech.api.unification.OreDictUnifier;
2829
import gregtech.api.unification.material.Material;
2930
import gregtech.api.unification.ore.OrePrefix;
30-
import gregtech.api.unification.stack.ItemMaterialInfo;
31+
import gregtech.api.unification.stack.RecyclingData;
3132
import gregtech.api.util.GTUtility;
3233
import gregtech.api.util.LocalizationUtils;
3334
import gregtech.api.util.Mods;
@@ -800,11 +801,11 @@ protected MetaValueItem(int metaValue, String unlocalizedName) {
800801
this.unlocalizedName = unlocalizedName;
801802
}
802803

803-
public MetaValueItem setMaterialInfo(ItemMaterialInfo materialInfo) {
804-
if (materialInfo == null) {
805-
throw new IllegalArgumentException("Cannot add null ItemMaterialInfo.");
804+
public MetaValueItem setRecyclingData(RecyclingData data) {
805+
if (data == null) {
806+
throw new IllegalArgumentException("Cannot add null RecyclingData.");
806807
}
807-
OreDictUnifier.registerOre(getStackForm(), materialInfo);
808+
GregTechAPI.RECYCLING_MANAGER.registerRecyclingData(getStackForm(), data);
808809
return this;
809810
}
810811

src/main/java/gregtech/api/recipes/ModHandler.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gregtech.api.recipes;
22

33
import gregtech.api.GTValues;
4+
import gregtech.api.GregTechAPI;
45
import gregtech.api.items.metaitem.MetaItem;
56
import gregtech.api.items.toolitem.IGTTool;
67
import gregtech.api.items.toolitem.ToolHelper;
@@ -11,6 +12,7 @@
1112
import gregtech.api.unification.material.properties.PropertyKey;
1213
import gregtech.api.unification.ore.OrePrefix;
1314
import gregtech.api.unification.stack.MaterialStack;
15+
import gregtech.api.unification.stack.RecyclingData;
1416
import gregtech.api.unification.stack.UnificationEntry;
1517
import gregtech.api.util.DummyContainer;
1618
import gregtech.api.util.GTLog;
@@ -266,7 +268,10 @@ public static void addShapedRecipe(boolean withUnificationData, @NotNull String
266268
addRecipe(regName, result, isNBTClearing, isMirrored, recipe);
267269

268270
if (withUnificationData) {
269-
OreDictUnifier.registerOre(result, RecyclingHandler.getRecyclingIngredients(result.getCount(), recipe));
271+
RecyclingData data = RecyclingHandler.getRecyclingIngredients(result.getCount(), recipe);
272+
if (data != null) {
273+
GregTechAPI.RECYCLING_MANAGER.registerRecyclingData(result, data);
274+
}
270275
}
271276
}
272277

src/main/java/gregtech/api/recipes/RecipeBuilder.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gregtech.api.recipes;
22

33
import gregtech.api.GTValues;
4+
import gregtech.api.GregTechAPI;
45
import gregtech.api.fluids.store.FluidStorageKey;
56
import gregtech.api.items.metaitem.MetaItem;
67
import gregtech.api.metatileentity.MetaTileEntity;
@@ -25,7 +26,7 @@
2526
import gregtech.api.unification.OreDictUnifier;
2627
import gregtech.api.unification.material.Material;
2728
import gregtech.api.unification.ore.OrePrefix;
28-
import gregtech.api.unification.stack.ItemMaterialInfo;
29+
import gregtech.api.unification.stack.RecyclingData;
2930
import gregtech.api.util.EnumValidationResult;
3031
import gregtech.api.util.GTLog;
3132
import gregtech.api.util.GTUtility;
@@ -1086,9 +1087,9 @@ public void buildAndRegister() {
10861087
if (hasItemRecycling()) {
10871088
// ignore input fluids for item-only recycling
10881089
ItemStack outputStack = getOutputs().get(0);
1089-
ItemMaterialInfo info = RecyclingHandler.getRecyclingIngredients(getInputs(), outputStack.getCount());
1090-
if (info != null) {
1091-
OreDictUnifier.registerOre(outputStack, info);
1090+
RecyclingData data = RecyclingHandler.getRecyclingIngredients(getInputs(), outputStack.getCount());
1091+
if (data != null) {
1092+
GregTechAPI.RECYCLING_MANAGER.registerRecyclingData(outputStack, data);
10921093
}
10931094
}
10941095

src/main/java/gregtech/api/recipes/RecyclingHandler.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package gregtech.api.recipes;
22

3+
import gregtech.api.GregTechAPI;
34
import gregtech.api.items.metaitem.MetaItem;
45
import gregtech.api.items.toolitem.ToolHelper;
56
import gregtech.api.recipes.ingredients.GTRecipeInput;
67
import gregtech.api.unification.OreDictUnifier;
78
import gregtech.api.unification.material.MarkerMaterial;
89
import gregtech.api.unification.material.Material;
910
import gregtech.api.unification.ore.OrePrefix;
10-
import gregtech.api.unification.stack.ItemMaterialInfo;
1111
import gregtech.api.unification.stack.MaterialStack;
12+
import gregtech.api.unification.stack.RecyclingData;
1213
import gregtech.api.unification.stack.UnificationEntry;
1314

1415
import net.minecraft.block.Block;
@@ -27,7 +28,7 @@
2728

2829
public class RecyclingHandler {
2930

30-
public static @Nullable ItemMaterialInfo getRecyclingIngredients(int outputCount, @NotNull Object... recipe) {
31+
public static @Nullable RecyclingData getRecyclingIngredients(int outputCount, @NotNull Object... recipe) {
3132
Char2IntOpenHashMap inputCountMap = new Char2IntOpenHashMap();
3233
Object2LongMap<Material> materialStacksExploded = new Object2LongOpenHashMap<>();
3334

@@ -74,13 +75,13 @@ public class RecyclingHandler {
7475
addItemStackToMaterialStacks(stack, materialStacksExploded, inputCountMap.get(lastChar));
7576
}
7677

77-
return new ItemMaterialInfo(materialStacksExploded.entrySet().stream()
78+
return new RecyclingData(materialStacksExploded.entrySet().stream()
7879
.map(e -> new MaterialStack(e.getKey(), e.getValue() / outputCount))
7980
.sorted(Comparator.comparingLong(m -> -m.amount))
8081
.collect(Collectors.toList()));
8182
}
8283

83-
public static @Nullable ItemMaterialInfo getRecyclingIngredients(List<GTRecipeInput> inputs, int outputCount) {
84+
public static @Nullable RecyclingData getRecyclingIngredients(List<GTRecipeInput> inputs, int outputCount) {
8485
Object2LongMap<Material> materialStacksExploded = new Object2LongOpenHashMap<>();
8586
for (GTRecipeInput input : inputs) {
8687
if (input == null || input.isNonConsumable()) continue;
@@ -90,7 +91,7 @@ public class RecyclingHandler {
9091
addItemStackToMaterialStacks(inputStack, materialStacksExploded, inputStack.getCount());
9192
}
9293

93-
return new ItemMaterialInfo(materialStacksExploded.entrySet().stream()
94+
return new RecyclingData(materialStacksExploded.entrySet().stream()
9495
.map(e -> new MaterialStack(e.getKey(), e.getValue() / outputCount))
9596
.sorted(Comparator.comparingLong(m -> -m.amount))
9697
.collect(Collectors.toList()));
@@ -99,10 +100,10 @@ public class RecyclingHandler {
99100
private static void addItemStackToMaterialStacks(@NotNull ItemStack itemStack,
100101
@NotNull Object2LongMap<Material> materialStacksExploded,
101102
int inputCount) {
102-
// First try to get ItemMaterialInfo
103-
ItemMaterialInfo info = OreDictUnifier.getMaterialInfo(itemStack);
104-
if (info != null) {
105-
for (MaterialStack ms : info.getMaterials()) {
103+
// First try to get Recycling Data
104+
RecyclingData data = GregTechAPI.RECYCLING_MANAGER.getRecyclingData(itemStack);
105+
if (data != null) {
106+
for (MaterialStack ms : data.getMaterials()) {
106107
if (!(ms.material instanceof MarkerMaterial)) {
107108
addMaterialStack(materialStacksExploded, inputCount, ms);
108109
}

src/main/java/gregtech/api/unification/OreDictUnifier.java

Lines changed: 17 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
import org.jetbrains.annotations.Nullable;
2727

2828
import java.util.*;
29-
import java.util.AbstractMap.SimpleEntry;
30-
import java.util.Map.Entry;
3129
import java.util.function.Function;
3230
import java.util.stream.Collectors;
3331

@@ -37,7 +35,6 @@ public class OreDictUnifier {
3735

3836
private OreDictUnifier() {}
3937

40-
private static final Map<ItemAndMetadata, ItemMaterialInfo> materialUnificationInfo = new Object2ObjectOpenHashMap<>();
4138
private static final Map<ItemAndMetadata, UnificationEntry> stackUnificationInfo = new Object2ObjectOpenHashMap<>();
4239
private static final Map<UnificationEntry, ArrayList<ItemAndMetadata>> stackUnificationItems = new Object2ObjectOpenHashMap<>();
4340
private static final Map<Item, ItemVariantMap.Mutable<Set<String>>> stackOreDictName = new Object2ObjectOpenHashMap<>();
@@ -65,11 +62,6 @@ public static Comparator<ItemStack> getItemStackComparator() {
6562
return (first, second) -> comparator.compare(new ItemAndMetadata(first), new ItemAndMetadata(second));
6663
}
6764

68-
public static void registerOre(ItemStack itemStack, ItemMaterialInfo materialInfo) {
69-
if (itemStack.isEmpty()) return;
70-
materialUnificationInfo.put(new ItemAndMetadata(itemStack), materialInfo);
71-
}
72-
7365
public static void registerOre(ItemStack itemStack, OrePrefix orePrefix, @Nullable Material material) {
7466
registerOre(itemStack, orePrefix.name(), material);
7567
}
@@ -226,11 +218,13 @@ public static boolean hasOreDictionary(@NotNull ItemStack itemStack, @NotNull St
226218
.collect(Collectors.toList());
227219
}
228220

229-
@Nullable
230-
public static MaterialStack getMaterial(ItemStack itemStack) {
231-
if (itemStack.isEmpty()) return null;
221+
public static @Nullable MaterialStack getMaterial(ItemStack itemStack) {
222+
if (itemStack.isEmpty()) {
223+
return null;
224+
}
225+
232226
ItemAndMetadata key = new ItemAndMetadata(itemStack);
233-
UnificationEntry entry = getOrWildcard(stackUnificationInfo, key);
227+
UnificationEntry entry = GTUtility.getOrWildcardMeta(stackUnificationInfo, key);
234228
if (entry != null) {
235229
Material entryMaterial = entry.material;
236230
if (entryMaterial == null) {
@@ -240,27 +234,22 @@ public static MaterialStack getMaterial(ItemStack itemStack) {
240234
return new MaterialStack(entryMaterial, entry.orePrefix.getMaterialAmount(entryMaterial));
241235
}
242236
}
243-
ItemMaterialInfo info = getOrWildcard(materialUnificationInfo, key);
244-
return info == null ? null : info.getMaterial().copy();
237+
return null;
245238
}
246239

247-
@Nullable
248-
public static ItemMaterialInfo getMaterialInfo(ItemStack itemStack) {
249-
if (itemStack.isEmpty()) return null;
250-
return getOrWildcard(materialUnificationInfo, new ItemAndMetadata(itemStack));
251-
}
252-
253-
@Nullable
254-
public static OrePrefix getPrefix(ItemStack itemStack) {
255-
if (itemStack.isEmpty()) return null;
256-
UnificationEntry entry = getOrWildcard(stackUnificationInfo, new ItemAndMetadata(itemStack));
240+
public static @Nullable OrePrefix getPrefix(ItemStack itemStack) {
241+
if (itemStack.isEmpty()) {
242+
return null;
243+
}
244+
UnificationEntry entry = GTUtility.getOrWildcardMeta(stackUnificationInfo, new ItemAndMetadata(itemStack));
257245
return entry != null ? entry.orePrefix : null;
258246
}
259247

260-
@Nullable
261-
public static UnificationEntry getUnificationEntry(ItemStack itemStack) {
262-
if (itemStack.isEmpty()) return null;
263-
return getOrWildcard(stackUnificationInfo, new ItemAndMetadata(itemStack));
248+
public static @Nullable UnificationEntry getUnificationEntry(ItemStack itemStack) {
249+
if (itemStack.isEmpty()) {
250+
return null;
251+
}
252+
return GTUtility.getOrWildcardMeta(stackUnificationInfo, new ItemAndMetadata(itemStack));
264253
}
265254

266255
public static ItemStack getUnificated(ItemStack itemStack) {
@@ -295,12 +284,6 @@ public static ItemStack get(String oreDictName) {
295284
return itemStacks.get(0).copy();
296285
}
297286

298-
public static List<Entry<ItemStack, ItemMaterialInfo>> getAllItemInfos() {
299-
return materialUnificationInfo.entrySet().stream()
300-
.map(entry -> new SimpleEntry<>(entry.getKey().toItemStack(), entry.getValue()))
301-
.collect(Collectors.toList());
302-
}
303-
304287
public static List<ItemStack> getAll(UnificationEntry unificationEntry) {
305288
if (!stackUnificationItems.containsKey(unificationEntry))
306289
return Collections.emptyList();
@@ -368,20 +351,4 @@ synchronized private static <T> void addAndSort(List<T> list, T itemToAdd, Compa
368351
if (list.size() > 1)
369352
list.sort(comparator);
370353
}
371-
372-
/**
373-
* Get the value corresponding to given key or its wildcard counterpart.
374-
*
375-
* @param map Map
376-
* @param key Key
377-
* @return value corresponding to given key or its wildcard counterpart
378-
*/
379-
@Nullable
380-
private static <T> T getOrWildcard(@NotNull Map<ItemAndMetadata, T> map,
381-
@NotNull ItemAndMetadata key) {
382-
T t = map.get(key);
383-
if (t != null) return t;
384-
if (key.isWildcard()) return null;
385-
return map.get(key.toWildcard());
386-
}
387354
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package gregtech.api.unification;
2+
3+
import gregtech.api.unification.stack.ItemAndMetadata;
4+
import gregtech.api.unification.stack.RecyclingData;
5+
import gregtech.api.util.GTUtility;
6+
7+
import net.minecraft.item.ItemStack;
8+
9+
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
10+
import org.jetbrains.annotations.NotNull;
11+
import org.jetbrains.annotations.Nullable;
12+
13+
import java.util.Map;
14+
import java.util.function.BiConsumer;
15+
16+
public final class RecyclingManager {
17+
18+
private final Map<ItemAndMetadata, RecyclingData> map = new Object2ObjectOpenHashMap<>();
19+
20+
/**
21+
* @param stack the stack to give recycling data
22+
* @param data the recycling data
23+
*/
24+
public void registerRecyclingData(@NotNull ItemStack stack, @NotNull RecyclingData data) {
25+
if (stack.isEmpty()) {
26+
return;
27+
}
28+
registerRecyclingData(new ItemAndMetadata(stack), data);
29+
}
30+
31+
/**
32+
* @param key the key to give recycling data
33+
* @param data the recycling data
34+
*/
35+
public void registerRecyclingData(@NotNull ItemAndMetadata key,
36+
@NotNull RecyclingData data) {
37+
map.put(key, data);
38+
}
39+
40+
/**
41+
* @param stack the stack
42+
* @return the recycling data associated with the stack
43+
*/
44+
public @Nullable RecyclingData getRecyclingData(@NotNull ItemStack stack) {
45+
if (stack.isEmpty()) {
46+
return null;
47+
}
48+
return getRecyclingData(new ItemAndMetadata(stack));
49+
}
50+
51+
/**
52+
* @param key the key
53+
* @return the recycling data associated with the key
54+
*/
55+
public @Nullable RecyclingData getRecyclingData(@NotNull ItemAndMetadata key) {
56+
return GTUtility.getOrWildcardMeta(map, key);
57+
}
58+
59+
/**
60+
* @param stack the stack whose data should be removed
61+
*/
62+
public void removeRecyclingData(@NotNull ItemStack stack) {
63+
if (stack.isEmpty()) {
64+
return;
65+
}
66+
removeRecyclingData(new ItemAndMetadata(stack));
67+
}
68+
69+
/**
70+
* @param key the key whose data should be removed
71+
*/
72+
public void removeRecyclingData(@NotNull ItemAndMetadata key) {
73+
map.remove(key);
74+
}
75+
76+
/**
77+
* Iterate all registered recycling entries
78+
*
79+
* @param action the action to apply to each entry
80+
*/
81+
public void iterate(@NotNull BiConsumer<ItemAndMetadata, RecyclingData> action) {
82+
map.forEach(action);
83+
}
84+
}

0 commit comments

Comments
 (0)