aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/kekztech
diff options
context:
space:
mode:
authorkekzdealer <kekzdealer@gmail.com>2020-06-11 19:13:57 +0200
committerkekzdealer <kekzdealer@gmail.com>2020-06-11 19:13:57 +0200
commitcc664f07248872c2d44f7ef22ab3a9d520c19f8d (patch)
tree5f95c28207b86e57b5e1343ce11a1a74c0a76f1c /src/main/java/kekztech
parentbed56a0bc6b45bc877ecd260177a664ab8a8e130 (diff)
downloadGT5-Unofficial-cc664f07248872c2d44f7ef22ab3a9d520c19f8d.tar.gz
GT5-Unofficial-cc664f07248872c2d44f7ef22ab3a9d520c19f8d.tar.bz2
GT5-Unofficial-cc664f07248872c2d44f7ef22ab3a9d520c19f8d.zip
Refactored MultiFluidHandler initialization to use a custom initializer method that doesn't require leaking the stored fluid objects
Diffstat (limited to 'src/main/java/kekztech')
-rw-r--r--src/main/java/kekztech/MultiFluidHandler.java110
1 files changed, 75 insertions, 35 deletions
diff --git a/src/main/java/kekztech/MultiFluidHandler.java b/src/main/java/kekztech/MultiFluidHandler.java
index 3e9bcfa0e5..ef65585a3b 100644
--- a/src/main/java/kekztech/MultiFluidHandler.java
+++ b/src/main/java/kekztech/MultiFluidHandler.java
@@ -1,34 +1,58 @@
package kekztech;
-import java.util.ArrayList;
-import java.util.List;
-
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
import net.minecraftforge.fluids.FluidStack;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
public class MultiFluidHandler {
-
- public static final int MAX_DISTINCT_FLUIDS = 25;
-
- private final List<FluidStack> fluids = new ArrayList<>(MAX_DISTINCT_FLUIDS);
- private int capacityPerFluid;
+
+ private final List<FluidStack> fluids;
+ private final int maxDistinctFluids;
+ private final int capacityPerFluid;
private boolean locked = true;
private boolean doVoidExcess = false;
private byte fluidSelector = -1;
- public MultiFluidHandler() {
-
- }
-
- public MultiFluidHandler(int capacityPerFluid) {
+ private MultiFluidHandler(int maxDistinctFluids, int capacityPerFluid, List<FluidStack> fluidsToAdd) {
+ this.maxDistinctFluids = maxDistinctFluids;
+ this.fluids = new ArrayList<>(maxDistinctFluids);
+ if(fluidsToAdd != null) {
+ this.fluids.addAll(fluidsToAdd);
+ }
this.capacityPerFluid = capacityPerFluid;
}
-
- public MultiFluidHandler(int capacityPerFluid, List<FluidStack> fluids) {
- this.capacityPerFluid = capacityPerFluid;
- this.fluids.addAll(fluids);
+
+ /**
+ * Initialize a new MultiFluidHandler object with the given parameters
+ * @param maxDistinctFluids
+ * How many different fluids can be stored
+ * @param capacityPerFluid
+ * How much capacity each fluid should have
+ * @param fluidsToAdd
+ * Fluids to add immediately
+ * @return
+ * A new instance
+ */
+ public static MultiFluidHandler newInstance(int maxDistinctFluids, int capacityPerFluid, FluidStack...fluidsToAdd) {
+ return new MultiFluidHandler(maxDistinctFluids, capacityPerFluid, Arrays.asList(fluidsToAdd));
+ }
+
+ /**
+ * Deep copy a MultiFluidHandler instance with a new capacity
+ * @param toCopy
+ * The MultiFluidHandler that should be copied
+ * @param capacityPerFluid
+ * How much capacity each fluid should have
+ * @return
+ * A new instance
+ */
+ public static MultiFluidHandler newAdjustedInstance(MultiFluidHandler toCopy, int capacityPerFluid) {
+ return new MultiFluidHandler(toCopy.maxDistinctFluids, capacityPerFluid, toCopy.fluids);
}
/**
@@ -79,7 +103,7 @@ public class MultiFluidHandler {
* deep copy of the requested FluidStack
*/
public FluidStack getFluidCopy(int slot) {
- return (!locked && fluids.size() > 0 && slot >= 0 && slot < MAX_DISTINCT_FLUIDS)
+ return (!locked && fluids.size() > 0 && slot >= 0 && slot < maxDistinctFluids)
? fluids.get(slot).copy() : null;
}
@@ -91,7 +115,14 @@ public class MultiFluidHandler {
public int getDistinctFluids() {
return fluids.size();
}
-
+
+ /**
+ * Helper method to save a MultiFluidHandler to NBT data
+ * @param nbt
+ * The NBT Tag to write to
+ * @return
+ * Updated NBT Tag
+ */
public NBTTagCompound saveNBTData(NBTTagCompound nbt) {
nbt = (nbt == null) ? new NBTTagCompound() : nbt;
@@ -103,21 +134,30 @@ public class MultiFluidHandler {
}
return nbt;
}
-
- public void loadNBTData(NBTTagCompound nbt) {
+
+ /**
+ * Helper method to initialize a MultiFluidHandler from NBT data
+ * @param nbt
+ * The NBT Tag to read from
+ * @return
+ * A new Instance
+ */
+ public MultiFluidHandler loadNBTData(NBTTagCompound nbt) {
nbt = (nbt == null) ? new NBTTagCompound() : nbt;
- capacityPerFluid = nbt.getInteger("capacityPerFluid");
-
- fluids.clear();
+ final int capacityPerFluid = nbt.getInteger("capacityPerFluid");
final NBTTagCompound fluidsTag = (NBTTagCompound) nbt.getTag("fluids");
- for(int i = 0; i < MultiFluidHandler.MAX_DISTINCT_FLUIDS; i++) {
- final NBTTagCompound fnbt = (NBTTagCompound) fluidsTag.getTag("" + i);
- if(fnbt == null) {
+ final ArrayList<FluidStack> loadedFluids = new ArrayList<>();
+ int distinctFluids = 0;
+ while(true) {
+ final NBTTagCompound fluidNBT = (NBTTagCompound) fluidsTag.getTag("" + distinctFluids);
+ if(fluidNBT == null) {
break;
}
- fluids.add(FluidStack.loadFluidStackFromNBT(fnbt));
+ loadedFluids.add(FluidStack.loadFluidStackFromNBT(fluidNBT));
+ distinctFluids++;
}
+ return new MultiFluidHandler(distinctFluids, capacityPerFluid, loadedFluids);
}
public ArrayList<String> getInfoData() {
@@ -145,10 +185,10 @@ public class MultiFluidHandler {
if(locked) {
return 0;
}
- if(fluids.size() == MAX_DISTINCT_FLUIDS && !contains(push)) {
+ if(fluids.size() == maxDistinctFluids && !contains(push)) {
// Already contains 25 fluids and this isn't one of them
return 0;
- } else if (fluids.size() < MAX_DISTINCT_FLUIDS && !contains(push)) {
+ } else if (fluids.size() < maxDistinctFluids && !contains(push)) {
// Add new fluid
final int fit = Math.min(getCapacity(), push.amount);
if(doPush) {
@@ -183,7 +223,7 @@ public class MultiFluidHandler {
if(locked) {
return 0;
}
- if(slot < 0 || slot >= MAX_DISTINCT_FLUIDS) {
+ if(slot < 0 || slot >= maxDistinctFluids) {
// Invalid slot
return 0;
}
@@ -242,7 +282,7 @@ public class MultiFluidHandler {
if(locked) {
return 0;
}
- if(slot < 0 || slot >= MAX_DISTINCT_FLUIDS) {
+ if(slot < 0 || slot >= maxDistinctFluids) {
return 0;
}
if(!fluids.get(slot).equals(pull)) {
@@ -270,13 +310,13 @@ public class MultiFluidHandler {
if(locked) {
return false;
}
- if(fluids.size() == MAX_DISTINCT_FLUIDS && !contains(push)) {
+ if(fluids.size() == maxDistinctFluids && !contains(push)) {
return false;
- } else if (fluids.size() < MAX_DISTINCT_FLUIDS && !contains(push)) {
+ } else if (fluids.size() < maxDistinctFluids && !contains(push)) {
return Math.min(getCapacity(), push.amount) > 0;
} else {
final int remcap = getCapacity() - fluids.get(fluids.indexOf(push)).amount;
- return doVoidExcess ? true : (Math.min(remcap, push.amount) > 0);
+ return doVoidExcess || (Math.min(remcap, push.amount) > 0);
}
}
}