1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
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<OreLayerWrapper> internalDimOreList = new ArrayList<>();
public final HashMap<OreLayerWrapper, Double> 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<String, OreLayerWrapper> mapOreLayerWrapper = new HashMap<>();
public static final HashMap<OreLayerWrapper, Map<String, Boolean>> bufferedDims = new HashMap<>();
public static final HashMap<String, NormalOreDimensionWrapper> 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, localizedName;
public final short[] Meta = new short[4];
public final short randomWeight, size, density;
public final Map<String, Boolean> 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.localizedName = mix.localizedName;
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<ItemStack> getVeinLayerOre(int maximumMaterialIndex, int veinLayer) {
List<ItemStack> 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;
}
}
}
|