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> fluidMap = new HashMap<>(); @SuppressWarnings("unchecked") public GT5UndergroundFluidHelper() { try { Field fieldDimensionList = GT_UO_DimensionList.class.getDeclaredField("fDimensionList"); fieldDimensionList.setAccessible(true); BiMap dimensionList = (BiMap) fieldDimensionList.get(GT_Mod.gregtechproxy.mUndergroundOil); for (Map.Entry 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> providers = (Hashtable>) fieldProviders.get(null); // some short dimension names like Io might be caught by multiple dimension classes, // so we'll check them all. // List dimensionCandidates = providers.values() List> dimensionCandidates = providers.values().stream() .filter(p -> p.getName().contains(rawDimension)) .collect(Collectors.toList()); loop: for (Class 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 fluids = (BiMap) fieldFluids.get(dimensionEntry.getValue()); int maxChance = 0; for (Map.Entry fluidEntry : fluids.entrySet()) { maxChance += fluidEntry.getValue().Chance; } for (Map.Entry 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 wrappers : fluidMap.values()) { wrappers.sort(Comparator.comparingInt( w -> Arrays.asList(DimensionHelper.DimNameDisplayed).indexOf(w.dimension))); } } public static List getEntry(String fluidName) { return fluidMap.get(fluidName); } public static Map> 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; } } }