package gtneioreplugin.util; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import net.minecraft.item.ItemStack; import gregtech.api.GregTechAPI; import gregtech.api.enums.Materials; import gregtech.api.enums.OreMixes; import gregtech.common.OreMixBuilder; public class GT5OreLayerHelper { public static class NormalOreDimensionWrapper { public final ArrayList internalDimOreList = new ArrayList<>(); public final HashMap oreVeinToProbabilityInDimension = new HashMap<>(); // Calculate all weights of ore veins once dimension is initialised. private void calculateWeights() { int totalWeight = 0; for (OreLayerWrapper oreVein : internalDimOreList) { totalWeight += oreVein.randomWeight; } for (OreLayerWrapper oreVein : internalDimOreList) { oreVeinToProbabilityInDimension.put(oreVein, ((double) oreVein.randomWeight) / ((double) totalWeight)); } } } private static final int DIMENSION_COUNT = 33; public static final Integer[] weightPerWorld = new Integer[DIMENSION_COUNT]; public static final Integer[] DimIDs = new Integer[DIMENSION_COUNT]; public static final HashMap mapOreLayerWrapper = new HashMap<>(); public static final HashMap> bufferedDims = new HashMap<>(); public static final HashMap dimToOreWrapper = new HashMap<>(); public static void init() { Arrays.fill(weightPerWorld, 0); Arrays.fill(DimIDs, 0); for (OreMixes mix : OreMixes.values()) mapOreLayerWrapper.put(mix.oreMixBuilder.oreMixName, new OreLayerWrapper(mix.oreMixBuilder)); for (OreLayerWrapper layer : mapOreLayerWrapper.values()) { bufferedDims.put(layer, DimensionHelper.getDims(layer)); } // --- Handling of dimToOreWrapper --- // Get dims as "Ow,Ne,Ma" etc. bufferedDims.forEach((veinInfo, dims) -> { for (String dim : dims.keySet()) { NormalOreDimensionWrapper dimensionOres = dimToOreWrapper .getOrDefault(dim, new NormalOreDimensionWrapper()); dimensionOres.internalDimOreList.add(veinInfo); dimToOreWrapper.put(dim, dimensionOres); } // Calculate probabilities for each dim. for (String dim : dimToOreWrapper.keySet()) { dimToOreWrapper.get(dim) .calculateWeights(); } }); // --- End of handling for dimToOreWrapper --- } public static class OreLayerWrapper { public final String veinName, worldGenHeightRange; public final short[] Meta = new short[4]; public final short randomWeight, size, density; public final Map allowedDimWithOrigNames; public final Materials mPrimaryVeinMaterial; public final Materials mSecondaryMaterial; public final Materials mBetweenMaterial; public final Materials mSporadicMaterial; public OreLayerWrapper(OreMixBuilder mix) { this.veinName = mix.oreMixName; this.Meta[0] = (short) mix.primary.mMetaItemSubID; this.Meta[1] = (short) mix.secondary.mMetaItemSubID; this.Meta[2] = (short) mix.between.mMetaItemSubID; this.Meta[3] = (short) mix.sporadic.mMetaItemSubID; this.mPrimaryVeinMaterial = mix.primary; this.mSecondaryMaterial = mix.secondary; this.mBetweenMaterial = mix.between; this.mSporadicMaterial = mix.sporadic; this.size = (short) mix.size; this.density = (short) mix.density; this.worldGenHeightRange = mix.minY + "-" + mix.maxY; this.randomWeight = (short) mix.weight; this.allowedDimWithOrigNames = mix.dimsEnabled; } public List getVeinLayerOre(int maximumMaterialIndex, int veinLayer) { List stackList = new ArrayList<>(); for (int i = 0; i < maximumMaterialIndex; i++) { stackList.add(getLayerOre(veinLayer, i)); } return stackList; } public ItemStack getLayerOre(int veinLayer, int materialIndex) { return new ItemStack(GregTechAPI.sBlockOres1, 1, Meta[veinLayer] + materialIndex * 1000); } public boolean containsOre(short materialIndex) { return Meta[OreVeinLayer.VEIN_PRIMARY] == materialIndex || Meta[OreVeinLayer.VEIN_SECONDARY] == materialIndex || Meta[OreVeinLayer.VEIN_BETWEEN] == materialIndex || Meta[OreVeinLayer.VEIN_SPORADIC] == materialIndex; } } }