use of mcjty.rftools.dimension.world.types.ControllerType in project RFTools by McJty.
the class BiomeDimletType method constructDimension.
@Override
public void constructDimension(List<Pair<DimletKey, List<DimletKey>>> dimlets, Random random, DimensionInformation dimensionInformation) {
Set<DimletKey> biomeKeys = new HashSet<DimletKey>();
List<Pair<DimletKey, List<DimletKey>>> biomeDimlets = DimensionInformation.extractType(DimletType.DIMLET_BIOME, dimlets);
List<Pair<DimletKey, List<DimletKey>>> controllerDimlets = DimensionInformation.extractType(DimletType.DIMLET_CONTROLLER, dimlets);
ControllerType controllerType;
// First determine the controller to use.
if (controllerDimlets.isEmpty()) {
if (random.nextFloat() < DimletConfiguration.randomControllerChance) {
List<DimletKey> keys = new ArrayList<DimletKey>(DimletObjectMapping.idToControllerType.keySet());
DimletKey key = keys.get(random.nextInt(keys.size()));
controllerType = DimletObjectMapping.idToControllerType.get(key);
} else {
if (biomeDimlets.isEmpty()) {
controllerType = ControllerType.CONTROLLER_DEFAULT;
} else if (biomeDimlets.size() > 1) {
controllerType = ControllerType.CONTROLLER_FILTERED;
} else {
controllerType = ControllerType.CONTROLLER_SINGLE;
}
}
} else {
DimletKey key = controllerDimlets.get(random.nextInt(controllerDimlets.size())).getLeft();
controllerType = DimletObjectMapping.idToControllerType.get(key);
}
dimensionInformation.setControllerType(controllerType);
// Now see if we have to add or randomize biomes.
for (Pair<DimletKey, List<DimletKey>> dimletWithModifiers : biomeDimlets) {
DimletKey key = dimletWithModifiers.getKey();
biomeKeys.add(key);
}
int neededBiomes = controllerType.getNeededBiomes();
if (neededBiomes == -1) {
// Can work with any number of biomes.
if (biomeKeys.size() >= 2) {
// We already have enough biomes
neededBiomes = biomeKeys.size();
} else {
neededBiomes = random.nextInt(10) + 3;
}
}
while (biomeKeys.size() < neededBiomes) {
DimletKey key;
List<DimletKey> keys = new ArrayList<DimletKey>(DimletObjectMapping.idToBiome.keySet());
key = keys.get(random.nextInt(keys.size()));
while (biomeKeys.contains(key)) {
key = keys.get(random.nextInt(keys.size()));
}
biomeKeys.add(key);
}
List<BiomeGenBase> biomes = dimensionInformation.getBiomes();
biomes.clear();
for (DimletKey key : biomeKeys) {
biomes.add(DimletObjectMapping.idToBiome.get(key));
}
}
use of mcjty.rftools.dimension.world.types.ControllerType in project RFTools by McJty.
the class GuiDimensionEnscriber method validateDimlets.
private void validateDimlets() {
List<String> tooltips = new ArrayList<String>();
TerrainType terrainType = null;
int cntTerrain = 0;
int cntBiomes = 0;
int cntController = 0;
int cntOwner = 0;
for (int i = DimensionEnscriberContainer.SLOT_DIMLETS; i < DimensionEnscriberContainer.SLOT_TAB; i++) {
Slot slot = inventorySlots.getSlot(i);
if (slot != null && slot.getStack() != null && slot.getStack().stackSize > 0) {
ItemStack stack = slot.getStack();
DimletKey key = KnownDimletConfiguration.getDimletKey(stack, Minecraft.getMinecraft().theWorld);
if (key.getType() == DimletType.DIMLET_TERRAIN) {
cntTerrain++;
terrainType = DimletObjectMapping.idToTerrainType.get(key);
} else if (key.getType() == DimletType.DIMLET_BIOME) {
cntBiomes++;
} else if (key.getType() == DimletType.DIMLET_CONTROLLER) {
cntController++;
} else if (key.getType() == DimletType.DIMLET_SPECIAL && DimletObjectMapping.idToSpecialType.get(key) == SpecialType.SPECIAL_OWNER) {
cntOwner++;
}
}
}
if (cntOwner > 1) {
tooltips.add("Using more then one owner dimlet is not useful!");
}
if (DimletConfiguration.ownerDimletsNeeded && cntOwner != 1) {
tooltips.add("You cannot make a dimension without an owner dimlet!");
storeButton.setEnabled(false);
}
if (cntTerrain > 1) {
tooltips.add("Using more then one TERRAIN is not useful!");
terrainType = null;
}
if (cntController > 1) {
tooltips.add("Using more then one CONTROLLER is not useful!");
}
List<DimletKey> modifiers = new ArrayList<DimletKey>();
for (int i = DimensionEnscriberContainer.SLOT_DIMLETS; i < DimensionEnscriberContainer.SLOT_TAB; i++) {
Slot slot = inventorySlots.getSlot(i);
if (slot != null && slot.getStack() != null && slot.getStack().stackSize > 0) {
ItemStack stack = slot.getStack();
DimletKey key = KnownDimletConfiguration.getDimletKey(stack, Minecraft.getMinecraft().theWorld);
DimletType type = key.getType();
if (type.dimletType.isModifier()) {
modifiers.add(key);
} else {
List<DimletKey> modifiersForType = extractModifiersForType(modifiers, type);
if (type == DimletType.DIMLET_TERRAIN) {
if (DimletObjectMapping.idToTerrainType.get(key) == TerrainType.TERRAIN_VOID && !modifiersForType.isEmpty()) {
tooltips.add("VOID terrain cannot use modifiers");
}
} else if (type == DimletType.DIMLET_FEATURE) {
FeatureType featureType = DimletObjectMapping.idToFeatureType.get(key);
Counter<DimletType> modifierAmountUsed = new Counter<DimletType>();
for (DimletKey modifier : modifiersForType) {
modifierAmountUsed.increment(modifier.getType());
}
for (Map.Entry<DimletType, Integer> entry : modifierAmountUsed.entrySet()) {
Integer amountSupported = featureType.getSupportedModifierAmount(entry.getKey());
if (amountSupported == null) {
tooltips.add(shortenName(featureType.name()) + " does not use " + shortenName(entry.getKey().name()) + " modifiers!");
} else if (amountSupported == 1 && entry.getValue() > 1) {
tooltips.add(shortenName(featureType.name()) + " only needs one " + shortenName(entry.getKey().name()) + " modifier!");
}
}
if (terrainType == null && !featureType.supportsAllTerrains()) {
tooltips.add(shortenName(featureType.name()) + " is possibly useless as it does not work on all terrains!");
}
if (terrainType != null && !featureType.isTerrainSupported(terrainType)) {
tooltips.add(shortenName(featureType.name()) + " does not work for terrain " + shortenName(terrainType.name()) + "!");
}
} else if (type == DimletType.DIMLET_CONTROLLER) {
ControllerType controllerType = DimletObjectMapping.idToControllerType.get(key);
int neededBiomes = controllerType.getNeededBiomes();
if (neededBiomes != -1) {
if (cntBiomes > neededBiomes) {
tooltips.add("Too many biomes specified for " + shortenName(controllerType.name()) + "!");
} else if (cntBiomes < neededBiomes) {
tooltips.add("Too few biomes specified for " + shortenName(controllerType.name()) + "!");
}
}
}
}
}
}
if (!modifiers.isEmpty()) {
tooltips.add("There are dangling modifiers in this descriptor");
}
boolean error = true;
if (tooltips.isEmpty()) {
tooltips.add("Everything appears to be alright");
error = false;
}
validateField.setTooltips(tooltips.toArray(new String[tooltips.size()]));
validateField.setColor(error ? 0xFF0000 : 0x008800);
validateField.setText(error ? "Warn" : "Ok");
}
use of mcjty.rftools.dimension.world.types.ControllerType in project RFTools by McJty.
the class GenericWorldChunkManager method getModdedBiomeGenerators.
@Override
public GenLayer[] getModdedBiomeGenerators(WorldType worldType, long seed, GenLayer[] original) {
if (dimensionInformation == null) {
dimensionInformation = hackyDimensionInformation;
}
GenLayer[] layer = super.getModdedBiomeGenerators(worldType, seed, original);
GenLayer rflayer = null;
ControllerType type;
DimensionInformation di = dimensionInformation;
if (di == null) {
di = hackyDimensionInformation;
}
type = di.getControllerType();
switch(type) {
case CONTROLLER_DEFAULT:
case CONTROLLER_SINGLE:
// Cannot happen
break;
case CONTROLLER_CHECKERBOARD:
rflayer = new GenLayerCheckerboard(this, seed, layer[0]);
break;
case CONTROLLER_COLD:
case CONTROLLER_WARM:
case CONTROLLER_MEDIUM:
case CONTROLLER_DRY:
case CONTROLLER_WET:
case CONTROLLER_FIELDS:
case CONTROLLER_MOUNTAINS:
case CONTROLLER_MAGICAL:
case CONTROLLER_FOREST:
case CONTROLLER_FILTERED:
rflayer = new GenLayerFiltered(this, seed, layer[0], type);
break;
}
GenLayerVoronoiZoom zoomLayer = new GenLayerVoronoiZoom(10L, rflayer);
try {
zoomLayer.initWorldGenSeed(seed);
} catch (Exception e) {
if (!workaroundErrorReported) {
Logging.logError("Error in RFTools getModdedBiomeGenerators possibly caused by another biome changing mod");
workaroundErrorReported = true;
e.printStackTrace();
}
}
return new GenLayer[] { rflayer, zoomLayer, rflayer };
}
Aggregations