Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/main/java/gregtech/api/GregTechAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import gregtech.api.network.INetworkHandler;
import gregtech.api.recipes.properties.RecipePropertyRegistry;
import gregtech.api.sound.ISoundManager;
import gregtech.api.unification.RecyclingManager;
import gregtech.api.unification.material.Material;
import gregtech.api.unification.material.registry.IMaterialRegistryManager;
import gregtech.api.unification.material.registry.MarkerMaterialRegistry;
Expand Down Expand Up @@ -58,6 +59,10 @@ public class GregTechAPI {
/** GT's data migrations API */
public static final MigrationAPI MIGRATIONS = new MigrationAPI();
public static final RecipePropertyRegistry RECIPE_PROPERTIES = new RecipePropertyRegistry();
/**
* Manager for Item Recycling Data
*/
public static final RecyclingManager RECYCLING_MANAGER = new RecyclingManager();

/** Will be available at the Pre-Initialization stage */
private static boolean highTier;
Expand Down
11 changes: 6 additions & 5 deletions src/main/java/gregtech/api/items/metaitem/MetaItem.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package gregtech.api.items.metaitem;

import gregtech.api.GTValues;
import gregtech.api.GregTechAPI;
import gregtech.api.capability.GregtechCapabilities;
import gregtech.api.capability.IElectricItem;
import gregtech.api.capability.IFilteredFluidContainer;
Expand All @@ -27,7 +28,7 @@
import gregtech.api.unification.OreDictUnifier;
import gregtech.api.unification.material.Material;
import gregtech.api.unification.ore.OrePrefix;
import gregtech.api.unification.stack.ItemMaterialInfo;
import gregtech.api.unification.stack.RecyclingData;
import gregtech.api.util.GTUtility;
import gregtech.api.util.LocalizationUtils;
import gregtech.api.util.Mods;
Expand Down Expand Up @@ -800,11 +801,11 @@ protected MetaValueItem(int metaValue, String unlocalizedName) {
this.unlocalizedName = unlocalizedName;
}

public MetaValueItem setMaterialInfo(ItemMaterialInfo materialInfo) {
if (materialInfo == null) {
throw new IllegalArgumentException("Cannot add null ItemMaterialInfo.");
public MetaValueItem setRecyclingData(RecyclingData data) {
if (data == null) {
throw new IllegalArgumentException("Cannot add null RecyclingData.");
}
OreDictUnifier.registerOre(getStackForm(), materialInfo);
GregTechAPI.RECYCLING_MANAGER.registerRecyclingData(getStackForm(), data);
return this;
}

Expand Down
7 changes: 6 additions & 1 deletion src/main/java/gregtech/api/recipes/ModHandler.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package gregtech.api.recipes;

import gregtech.api.GTValues;
import gregtech.api.GregTechAPI;
import gregtech.api.items.metaitem.MetaItem;
import gregtech.api.items.toolitem.IGTTool;
import gregtech.api.items.toolitem.ToolHelper;
Expand All @@ -11,6 +12,7 @@
import gregtech.api.unification.material.properties.PropertyKey;
import gregtech.api.unification.ore.OrePrefix;
import gregtech.api.unification.stack.MaterialStack;
import gregtech.api.unification.stack.RecyclingData;
import gregtech.api.unification.stack.UnificationEntry;
import gregtech.api.util.DummyContainer;
import gregtech.api.util.GTLog;
Expand Down Expand Up @@ -266,7 +268,10 @@ public static void addShapedRecipe(boolean withUnificationData, @NotNull String
addRecipe(regName, result, isNBTClearing, isMirrored, recipe);

if (withUnificationData) {
OreDictUnifier.registerOre(result, RecyclingHandler.getRecyclingIngredients(result.getCount(), recipe));
RecyclingData data = RecyclingHandler.getRecyclingIngredients(result.getCount(), recipe);
if (data != null) {
GregTechAPI.RECYCLING_MANAGER.registerRecyclingData(result, data);
}
}
}

Expand Down
9 changes: 5 additions & 4 deletions src/main/java/gregtech/api/recipes/RecipeBuilder.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package gregtech.api.recipes;

import gregtech.api.GTValues;
import gregtech.api.GregTechAPI;
import gregtech.api.fluids.store.FluidStorageKey;
import gregtech.api.items.metaitem.MetaItem;
import gregtech.api.metatileentity.MetaTileEntity;
Expand All @@ -25,7 +26,7 @@
import gregtech.api.unification.OreDictUnifier;
import gregtech.api.unification.material.Material;
import gregtech.api.unification.ore.OrePrefix;
import gregtech.api.unification.stack.ItemMaterialInfo;
import gregtech.api.unification.stack.RecyclingData;
import gregtech.api.util.EnumValidationResult;
import gregtech.api.util.GTLog;
import gregtech.api.util.GTUtility;
Expand Down Expand Up @@ -1086,9 +1087,9 @@ public void buildAndRegister() {
if (hasItemRecycling()) {
// ignore input fluids for item-only recycling
ItemStack outputStack = getOutputs().get(0);
ItemMaterialInfo info = RecyclingHandler.getRecyclingIngredients(getInputs(), outputStack.getCount());
if (info != null) {
OreDictUnifier.registerOre(outputStack, info);
RecyclingData data = RecyclingHandler.getRecyclingIngredients(getInputs(), outputStack.getCount());
if (data != null) {
GregTechAPI.RECYCLING_MANAGER.registerRecyclingData(outputStack, data);
}
}

Expand Down
19 changes: 10 additions & 9 deletions src/main/java/gregtech/api/recipes/RecyclingHandler.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package gregtech.api.recipes;

import gregtech.api.GregTechAPI;
import gregtech.api.items.metaitem.MetaItem;
import gregtech.api.items.toolitem.ToolHelper;
import gregtech.api.recipes.ingredients.GTRecipeInput;
import gregtech.api.unification.OreDictUnifier;
import gregtech.api.unification.material.MarkerMaterial;
import gregtech.api.unification.material.Material;
import gregtech.api.unification.ore.OrePrefix;
import gregtech.api.unification.stack.ItemMaterialInfo;
import gregtech.api.unification.stack.MaterialStack;
import gregtech.api.unification.stack.RecyclingData;
import gregtech.api.unification.stack.UnificationEntry;

import net.minecraft.block.Block;
Expand All @@ -27,7 +28,7 @@

public class RecyclingHandler {

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

Expand Down Expand Up @@ -74,13 +75,13 @@ public class RecyclingHandler {
addItemStackToMaterialStacks(stack, materialStacksExploded, inputCountMap.get(lastChar));
}

return new ItemMaterialInfo(materialStacksExploded.entrySet().stream()
return new RecyclingData(materialStacksExploded.entrySet().stream()
.map(e -> new MaterialStack(e.getKey(), e.getValue() / outputCount))
.sorted(Comparator.comparingLong(m -> -m.amount))
.collect(Collectors.toList()));
}

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

return new ItemMaterialInfo(materialStacksExploded.entrySet().stream()
return new RecyclingData(materialStacksExploded.entrySet().stream()
.map(e -> new MaterialStack(e.getKey(), e.getValue() / outputCount))
.sorted(Comparator.comparingLong(m -> -m.amount))
.collect(Collectors.toList()));
Expand All @@ -99,10 +100,10 @@ public class RecyclingHandler {
private static void addItemStackToMaterialStacks(@NotNull ItemStack itemStack,
@NotNull Object2LongMap<Material> materialStacksExploded,
int inputCount) {
// First try to get ItemMaterialInfo
ItemMaterialInfo info = OreDictUnifier.getMaterialInfo(itemStack);
if (info != null) {
for (MaterialStack ms : info.getMaterials()) {
// First try to get Recycling Data
RecyclingData data = GregTechAPI.RECYCLING_MANAGER.getRecyclingData(itemStack);
if (data != null) {
for (MaterialStack ms : data.getMaterials()) {
if (!(ms.material instanceof MarkerMaterial)) {
addMaterialStack(materialStacksExploded, inputCount, ms);
}
Expand Down
67 changes: 17 additions & 50 deletions src/main/java/gregtech/api/unification/OreDictUnifier.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@
import org.jetbrains.annotations.Nullable;

import java.util.*;
import java.util.AbstractMap.SimpleEntry;
import java.util.Map.Entry;
import java.util.function.Function;
import java.util.stream.Collectors;

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

private OreDictUnifier() {}

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

public static void registerOre(ItemStack itemStack, ItemMaterialInfo materialInfo) {
if (itemStack.isEmpty()) return;
materialUnificationInfo.put(new ItemAndMetadata(itemStack), materialInfo);
}

public static void registerOre(ItemStack itemStack, OrePrefix orePrefix, @Nullable Material material) {
registerOre(itemStack, orePrefix.name(), material);
}
Expand Down Expand Up @@ -226,11 +218,13 @@ public static boolean hasOreDictionary(@NotNull ItemStack itemStack, @NotNull St
.collect(Collectors.toList());
}

@Nullable
public static MaterialStack getMaterial(ItemStack itemStack) {
if (itemStack.isEmpty()) return null;
public static @Nullable MaterialStack getMaterial(ItemStack itemStack) {
if (itemStack.isEmpty()) {
return null;
}

ItemAndMetadata key = new ItemAndMetadata(itemStack);
UnificationEntry entry = getOrWildcard(stackUnificationInfo, key);
UnificationEntry entry = GTUtility.getOrWildcardMeta(stackUnificationInfo, key);
if (entry != null) {
Material entryMaterial = entry.material;
if (entryMaterial == null) {
Expand All @@ -240,27 +234,22 @@ public static MaterialStack getMaterial(ItemStack itemStack) {
return new MaterialStack(entryMaterial, entry.orePrefix.getMaterialAmount(entryMaterial));
}
}
ItemMaterialInfo info = getOrWildcard(materialUnificationInfo, key);
return info == null ? null : info.getMaterial().copy();
return null;
}

@Nullable
public static ItemMaterialInfo getMaterialInfo(ItemStack itemStack) {
if (itemStack.isEmpty()) return null;
return getOrWildcard(materialUnificationInfo, new ItemAndMetadata(itemStack));
}

@Nullable
public static OrePrefix getPrefix(ItemStack itemStack) {
if (itemStack.isEmpty()) return null;
UnificationEntry entry = getOrWildcard(stackUnificationInfo, new ItemAndMetadata(itemStack));
public static @Nullable OrePrefix getPrefix(ItemStack itemStack) {
if (itemStack.isEmpty()) {
return null;
}
UnificationEntry entry = GTUtility.getOrWildcardMeta(stackUnificationInfo, new ItemAndMetadata(itemStack));
return entry != null ? entry.orePrefix : null;
}

@Nullable
public static UnificationEntry getUnificationEntry(ItemStack itemStack) {
if (itemStack.isEmpty()) return null;
return getOrWildcard(stackUnificationInfo, new ItemAndMetadata(itemStack));
public static @Nullable UnificationEntry getUnificationEntry(ItemStack itemStack) {
if (itemStack.isEmpty()) {
return null;
}
return GTUtility.getOrWildcardMeta(stackUnificationInfo, new ItemAndMetadata(itemStack));
}

public static ItemStack getUnificated(ItemStack itemStack) {
Expand Down Expand Up @@ -295,12 +284,6 @@ public static ItemStack get(String oreDictName) {
return itemStacks.get(0).copy();
}

public static List<Entry<ItemStack, ItemMaterialInfo>> getAllItemInfos() {
return materialUnificationInfo.entrySet().stream()
.map(entry -> new SimpleEntry<>(entry.getKey().toItemStack(), entry.getValue()))
.collect(Collectors.toList());
}

public static List<ItemStack> getAll(UnificationEntry unificationEntry) {
if (!stackUnificationItems.containsKey(unificationEntry))
return Collections.emptyList();
Expand Down Expand Up @@ -368,20 +351,4 @@ synchronized private static <T> void addAndSort(List<T> list, T itemToAdd, Compa
if (list.size() > 1)
list.sort(comparator);
}

/**
* Get the value corresponding to given key or its wildcard counterpart.
*
* @param map Map
* @param key Key
* @return value corresponding to given key or its wildcard counterpart
*/
@Nullable
private static <T> T getOrWildcard(@NotNull Map<ItemAndMetadata, T> map,
@NotNull ItemAndMetadata key) {
T t = map.get(key);
if (t != null) return t;
if (key.isWildcard()) return null;
return map.get(key.toWildcard());
}
}
84 changes: 84 additions & 0 deletions src/main/java/gregtech/api/unification/RecyclingManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package gregtech.api.unification;

import gregtech.api.unification.stack.ItemAndMetadata;
import gregtech.api.unification.stack.RecyclingData;
import gregtech.api.util.GTUtility;

import net.minecraft.item.ItemStack;

import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Map;
import java.util.function.BiConsumer;

public final class RecyclingManager {

private final Map<ItemAndMetadata, RecyclingData> map = new Object2ObjectOpenHashMap<>();

/**
* @param stack the stack to give recycling data
* @param data the recycling data
*/
public void registerRecyclingData(@NotNull ItemStack stack, @NotNull RecyclingData data) {
if (stack.isEmpty()) {
return;
}
registerRecyclingData(new ItemAndMetadata(stack), data);
}

/**
* @param key the key to give recycling data
* @param data the recycling data
*/
public void registerRecyclingData(@NotNull ItemAndMetadata key,
@NotNull RecyclingData data) {
map.put(key, data);
}

/**
* @param stack the stack
* @return the recycling data associated with the stack
*/
public @Nullable RecyclingData getRecyclingData(@NotNull ItemStack stack) {
if (stack.isEmpty()) {
return null;
}
return getRecyclingData(new ItemAndMetadata(stack));
}

/**
* @param key the key
* @return the recycling data associated with the key
*/
public @Nullable RecyclingData getRecyclingData(@NotNull ItemAndMetadata key) {
return GTUtility.getOrWildcardMeta(map, key);
}

/**
* @param stack the stack whose data should be removed
*/
public void removeRecyclingData(@NotNull ItemStack stack) {
if (stack.isEmpty()) {
return;
}
removeRecyclingData(new ItemAndMetadata(stack));
}

/**
* @param key the key whose data should be removed
*/
public void removeRecyclingData(@NotNull ItemAndMetadata key) {
map.remove(key);
}

/**
* Iterate all registered recycling entries
*
* @param action the action to apply to each entry
*/
public void iterate(@NotNull BiConsumer<ItemAndMetadata, RecyclingData> action) {
map.forEach(action);
}
}
Loading
Loading