Improve performance for fast crafters (#3000)

This commit is contained in:
Anton Bulakh
2021-06-12 18:07:43 +03:00
committed by GitHub
parent 2128cae72b
commit 9c21cad9f6

View File

@@ -12,6 +12,7 @@ import net.minecraft.nbt.ListNBT;
import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nullable;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
@@ -30,6 +31,11 @@ public class NodeRequirements {
private final Map<Integer, IStackList<FluidStack>> fluidRequirements = new LinkedHashMap<>(); private final Map<Integer, IStackList<FluidStack>> fluidRequirements = new LinkedHashMap<>();
private final Map<Integer, Integer> fluidsNeededPerCraft = new LinkedHashMap<>(); private final Map<Integer, Integer> fluidsNeededPerCraft = new LinkedHashMap<>();
@Nullable
private IStackList<ItemStack> cachedSimulatedItemRequirementSet = null;
@Nullable
private IStackList<FluidStack> cachedSimulatedFluidRequirementSet = null;
public void addItemRequirement(int ingredientNumber, ItemStack stack, int size, int perCraft) { public void addItemRequirement(int ingredientNumber, ItemStack stack, int size, int perCraft) {
if (!itemsNeededPerCraft.containsKey(ingredientNumber)) { if (!itemsNeededPerCraft.containsKey(ingredientNumber)) {
itemsNeededPerCraft.put(ingredientNumber, perCraft); itemsNeededPerCraft.put(ingredientNumber, perCraft);
@@ -37,6 +43,7 @@ public class NodeRequirements {
IStackList<ItemStack> list = itemRequirements.computeIfAbsent(ingredientNumber, key -> API.instance().createItemStackList()); IStackList<ItemStack> list = itemRequirements.computeIfAbsent(ingredientNumber, key -> API.instance().createItemStackList());
list.add(stack, size); list.add(stack, size);
cachedSimulatedItemRequirementSet = null;
} }
public void addFluidRequirement(int ingredientNumber, FluidStack stack, int size, int perCraft) { public void addFluidRequirement(int ingredientNumber, FluidStack stack, int size, int perCraft) {
@@ -46,9 +53,15 @@ public class NodeRequirements {
IStackList<FluidStack> list = fluidRequirements.computeIfAbsent(ingredientNumber, key -> API.instance().createFluidStackList()); IStackList<FluidStack> list = fluidRequirements.computeIfAbsent(ingredientNumber, key -> API.instance().createFluidStackList());
list.add(stack, size); list.add(stack, size);
cachedSimulatedFluidRequirementSet = null;
} }
public IStackList<ItemStack> getSingleItemRequirementSet(boolean simulate) { public IStackList<ItemStack> getSingleItemRequirementSet(boolean simulate) {
IStackList<ItemStack> cached = cachedSimulatedItemRequirementSet;
if (simulate && cached != null) {
return cached;
}
IStackList<ItemStack> toReturn = API.instance().createItemStackList(); IStackList<ItemStack> toReturn = API.instance().createItemStackList();
for (int i = 0; i < itemRequirements.size(); i++) { for (int i = 0; i < itemRequirements.size(); i++) {
@@ -83,10 +96,17 @@ public class NodeRequirements {
} }
} }
cachedSimulatedItemRequirementSet = simulate ? toReturn : null;
return toReturn; return toReturn;
} }
public IStackList<FluidStack> getSingleFluidRequirementSet(boolean simulate) { public IStackList<FluidStack> getSingleFluidRequirementSet(boolean simulate) {
IStackList<FluidStack> cached = cachedSimulatedFluidRequirementSet;
if (simulate && cached != null) {
return cached;
}
IStackList<FluidStack> toReturn = API.instance().createFluidStackList(); IStackList<FluidStack> toReturn = API.instance().createFluidStackList();
for (int i = 0; i < fluidRequirements.size(); i++) { for (int i = 0; i < fluidRequirements.size(); i++) {
@@ -121,6 +141,8 @@ public class NodeRequirements {
} }
} }
cachedSimulatedFluidRequirementSet = simulate ? toReturn : null;
return toReturn; return toReturn;
} }