aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/pers/gwyog/gtneioreplugin/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/pers/gwyog/gtneioreplugin/util')
-rw-r--r--src/main/java/pers/gwyog/gtneioreplugin/util/DimensionHelper.java21
-rw-r--r--src/main/java/pers/gwyog/gtneioreplugin/util/GT5UndergroundFluidHelper.java170
2 files changed, 186 insertions, 5 deletions
diff --git a/src/main/java/pers/gwyog/gtneioreplugin/util/DimensionHelper.java b/src/main/java/pers/gwyog/gtneioreplugin/util/DimensionHelper.java
index 90d49d7e35..74f726dac1 100644
--- a/src/main/java/pers/gwyog/gtneioreplugin/util/DimensionHelper.java
+++ b/src/main/java/pers/gwyog/gtneioreplugin/util/DimensionHelper.java
@@ -5,6 +5,7 @@ import static pers.gwyog.gtneioreplugin.GTNEIOrePlugin.maxTooltipLines;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
+import java.util.stream.Collectors;
import net.minecraft.client.resources.I18n;
public class DimensionHelper {
@@ -29,6 +30,7 @@ public class DimensionHelper {
"GalaxySpace_Ceres",
"GalaxySpace_Europa",
"GalaxySpace_Ganymede",
+ "Ross128b",
// T4
"GalaxySpace_Io",
"GalaxySpace_Mercury",
@@ -38,6 +40,7 @@ public class DimensionHelper {
"GalaxySpace_Miranda",
"GalaxySpace_Oberon",
"GalaxySpace_Titan",
+ "Ross128ba",
// T6
"GalaxySpace_Proteus",
"GalaxySpace_Triton",
@@ -56,6 +59,14 @@ public class DimensionHelper {
"GalaxySpace_VegaB",
};
+ public static String[] DimNameTrimmed = Arrays.stream(DimName)
+ .map(n -> n.replaceAll("GalacticraftCore_", "")
+ .replaceAll("GalacticraftMars_", "")
+ .replaceAll("GalaxySpace_", "")
+ .replaceAll("Vanilla_", "Vanilla "))
+ .collect(Collectors.toList())
+ .toArray(new String[0]);
+
public static String[]
DimNameDisplayed = { // first 2 letters if one word else 1 letter of every word, except capital letter in
// name, then 1rst + capital Moon = Mo, BarnardC = BC, EndAsteroid = EA
@@ -78,6 +89,7 @@ public class DimensionHelper {
"Ce", // GalaxySpace_Ceres
"Eu", // GalaxySpace_Europa
"Ga", // GalaxySpace_Ganymede
+ "Rb", // Ross128b
// T4
"Io", // GalaxySpace_Io
"Me", // GalaxySpace_Mercury
@@ -87,6 +99,7 @@ public class DimensionHelper {
"Mi", // GalaxySpace_Miranda
"Ob", // GalaxySpace_Oberon
"Ti", // GalaxySpace_Titan
+ "Ra", // Ross128ba
// T6
"Pr", // GalaxySpace_Proteus
"Tr", // GalaxySpace_Triton
@@ -113,11 +126,7 @@ public class DimensionHelper {
String s = dims[j];
for (int i = 0; i < DimNameDisplayed.length; i++) {
if (s.equals(DimNameDisplayed[i])) {
- String k = DimName[i]
- .replaceAll("GalacticraftCore_", "")
- .replaceAll("GalacticraftMars_", "")
- .replaceAll("GalaxySpace_", "")
- .replaceAll("Vanilla_", "Vanilla ");
+ String k = DimNameTrimmed[i];
s = I18n.format("gtnop.world." + k);
switch (k) {
case "Moon":
@@ -133,6 +142,7 @@ public class DimensionHelper {
case "Ceres":
case "Europa":
case "Ganymede":
+ case "Ross128b":
s = "T3: " + s;
break;
case "Io":
@@ -144,6 +154,7 @@ public class DimensionHelper {
case "Miranda":
case "Oberon":
case "Titan":
+ case "Ross128ba":
s = "T5: " + s;
break;
case "Proteus":
diff --git a/src/main/java/pers/gwyog/gtneioreplugin/util/GT5UndergroundFluidHelper.java b/src/main/java/pers/gwyog/gtneioreplugin/util/GT5UndergroundFluidHelper.java
new file mode 100644
index 0000000000..731867953d
--- /dev/null
+++ b/src/main/java/pers/gwyog/gtneioreplugin/util/GT5UndergroundFluidHelper.java
@@ -0,0 +1,170 @@
+package pers.gwyog.gtneioreplugin.util;
+
+import static pers.gwyog.gtneioreplugin.GTNEIOrePlugin.LOG;
+
+import com.google.common.collect.BiMap;
+import gregtech.GT_Mod;
+import gregtech.api.objects.GT_UO_Dimension;
+import gregtech.api.objects.GT_UO_DimensionList;
+import gregtech.api.objects.GT_UO_Fluid;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import net.minecraft.world.WorldProvider;
+import net.minecraftforge.common.DimensionManager;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+
+public class GT5UndergroundFluidHelper {
+
+ /**
+ * Need to store fluid name instead of fluid
+ * because fluid instance might be different between gas and liquid
+ */
+ private static final Map<String, List<UndergroundFluidWrapper>> fluidMap = new HashMap<>();
+
+ @SuppressWarnings("unchecked")
+ public GT5UndergroundFluidHelper() {
+ try {
+ Field fieldDimensionList = GT_UO_DimensionList.class.getDeclaredField("fDimensionList");
+ fieldDimensionList.setAccessible(true);
+ BiMap<String, GT_UO_Dimension> dimensionList =
+ (BiMap<String, GT_UO_Dimension>) fieldDimensionList.get(GT_Mod.gregtechproxy.mUndergroundOil);
+ for (Map.Entry<String, GT_UO_Dimension> dimensionEntry : dimensionList.entrySet()) {
+ String rawDimension = dimensionEntry.getKey();
+ String dimension = null;
+ try {
+ dimension = getDimensionFromID(Integer.parseInt(rawDimension));
+ } catch (NumberFormatException ignored) {
+ Field fieldProviders = DimensionManager.class.getDeclaredField("providers");
+ fieldProviders.setAccessible(true);
+ Hashtable<Integer, Class<? extends WorldProvider>> providers =
+ (Hashtable<Integer, Class<? extends WorldProvider>>) fieldProviders.get(null);
+
+ // some short dimension names like Io might be caught by multiple dimension classes,
+ // so we'll check them all.
+ // List<WorldProvider> dimensionCandidates = providers.values()
+ List<Class<? extends WorldProvider>> dimensionCandidates = providers.values().stream()
+ .filter(p -> p.getName().contains(rawDimension))
+ .collect(Collectors.toList());
+ loop:
+ for (Class<? extends WorldProvider> candidate : dimensionCandidates) {
+ for (int i = 0; i < DimensionHelper.DimNameTrimmed.length; i++) {
+ if (DimensionHelper.DimNameTrimmed[i].equalsIgnoreCase(
+ candidate.newInstance().getDimensionName())) {
+ dimension = DimensionHelper.DimNameDisplayed[i];
+ break loop;
+ }
+ }
+ }
+ }
+
+ if (dimension == null) {
+ dimension = getDimensionForEdgeCase(rawDimension);
+ if (dimension == null) {
+ LOG.warn("Unknown dimension found in GT5 config: " + rawDimension);
+ continue;
+ }
+ }
+
+ Field fieldFluids = GT_UO_Dimension.class.getDeclaredField("fFluids");
+ fieldFluids.setAccessible(true);
+ BiMap<String, GT_UO_Fluid> fluids =
+ (BiMap<String, GT_UO_Fluid>) fieldFluids.get(dimensionEntry.getValue());
+
+ int maxChance = 0;
+ for (Map.Entry<String, GT_UO_Fluid> fluidEntry : fluids.entrySet()) {
+ maxChance += fluidEntry.getValue().Chance;
+ }
+
+ for (Map.Entry<String, GT_UO_Fluid> fluidEntry : fluids.entrySet()) {
+ Fluid fluid = FluidRegistry.getFluid(fluidEntry.getKey());
+ if (fluid != null) {
+ UndergroundFluidWrapper wrapper = new UndergroundFluidWrapper(
+ dimension,
+ fluidEntry.getValue().Chance * 10000 / maxChance,
+ fluidEntry.getValue().MaxAmount,
+ fluidEntry.getValue().MinAmount);
+ if (fluidMap.containsKey(fluid.getName())) {
+ fluidMap.get(fluid.getName()).add(wrapper);
+ } else {
+ fluidMap.put(fluid.getName(), new ArrayList<>(Collections.singletonList(wrapper)));
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ for (List<UndergroundFluidWrapper> wrappers : fluidMap.values()) {
+ wrappers.sort(Comparator.comparingInt(
+ w -> Arrays.asList(DimensionHelper.DimNameDisplayed).indexOf(w.dimension)));
+ }
+ }
+
+ public static List<UndergroundFluidWrapper> getEntry(String fluidName) {
+ return fluidMap.get(fluidName);
+ }
+
+ public static Map<String, List<UndergroundFluidWrapper>> getAllEntries() {
+ return fluidMap;
+ }
+
+ @SuppressWarnings("SwitchStatementWithTooFewBranches")
+ private String getDimensionFromID(int id) {
+ switch (id) {
+ case 0:
+ return "Ow";
+ default:
+ return null;
+ }
+ }
+
+ private String getDimensionForEdgeCase(String rawDimension) {
+ switch (rawDimension) {
+ case "aCentauriBb":
+ return "CB";
+ case "BarnardaC":
+ return "BC";
+ case "BarnardaE":
+ return "BE";
+ case "BarnardaF":
+ return "BF";
+ case "TCetiE":
+ return "TE";
+ default:
+ LOG.warn("Unknown dimension name while parsing: " + rawDimension);
+ return null;
+ }
+ }
+
+ public static class UndergroundFluidWrapper {
+
+ /**
+ * Using {@link DimensionHelper#DimNameDisplayed}
+ */
+ public final String dimension;
+ /**
+ * Chance of this fluid field being generated. 10000 means 100% of the dimension
+ */
+ public final int chance;
+
+ public final int maxAmount;
+ public final int minAmount;
+
+ public UndergroundFluidWrapper(String dimension, int chance, int maxAmount, int minAmount) {
+ this.dimension = dimension;
+ this.chance = chance;
+ this.maxAmount = maxAmount;
+ this.minAmount = minAmount;
+ }
+ }
+}