use of mcjty.rftools.dimension.world.types.TerrainType in project RFTools by McJty.
the class FeatureDimletType method constructDimension.
@Override
public void constructDimension(List<Pair<DimletKey, List<DimletKey>>> dimlets, Random random, DimensionInformation dimensionInformation) {
TerrainType terrainType = dimensionInformation.getTerrainType();
Set<FeatureType> featureTypes = dimensionInformation.getFeatureTypes();
dimlets = DimensionInformation.extractType(DimletType.DIMLET_FEATURE, dimlets);
if (dimlets.isEmpty()) {
while (random.nextFloat() < DimletConfiguration.randomFeatureChance) {
DimletKey key = DimletRandomizer.getRandomFeature(random, false);
FeatureType featureType = DimletObjectMapping.idToFeatureType.get(key);
if (!featureTypes.contains(featureType) && featureType.isTerrainSupported(terrainType)) {
dimensionInformation.updateCostFactor(key);
featureTypes.add(featureType);
List<DimletKey> modifiers = Collections.emptyList();
// @todo randomize those?
dimlets.add(Pair.of(key, modifiers));
}
}
}
Map<FeatureType, List<DimletKey>> modifiersForFeature = new HashMap<FeatureType, List<DimletKey>>();
for (Pair<DimletKey, List<DimletKey>> dimlet : dimlets) {
DimletKey key = dimlet.getLeft();
FeatureType featureType = DimletObjectMapping.idToFeatureType.get(key);
featureTypes.add(featureType);
modifiersForFeature.put(featureType, dimlet.getRight());
}
dimensionInformation.setFluidsForLakes(getRandomFluidArray(random, dimensionInformation, featureTypes, modifiersForFeature, FeatureType.FEATURE_LAKES, true));
dimensionInformation.setExtraOregen(getRandomBlockArray(random, featureTypes, modifiersForFeature, FeatureType.FEATURE_OREGEN, true));
dimensionInformation.setTendrilBlock(dimensionInformation.getFeatureBlock(random, modifiersForFeature, FeatureType.FEATURE_TENDRILS));
dimensionInformation.setSphereBlocks(getRandomBlockArray(random, featureTypes, modifiersForFeature, FeatureType.FEATURE_ORBS, false));
dimensionInformation.setPyramidBlocks(getRandomBlockArray(random, featureTypes, modifiersForFeature, FeatureType.FEATURE_PYRAMIDS, false));
dimensionInformation.setHugeSphereBlocks(getRandomBlockArray(random, featureTypes, modifiersForFeature, FeatureType.FEATURE_HUGEORBS, false));
dimensionInformation.setLiquidSphereBlocks(getRandomBlockArray(random, featureTypes, modifiersForFeature, FeatureType.FEATURE_LIQUIDORBS, false));
dimensionInformation.setLiquidSphereFluids(getRandomFluidArray(random, dimensionInformation, featureTypes, modifiersForFeature, FeatureType.FEATURE_LIQUIDORBS, false));
dimensionInformation.setHugeLiquidSphereBlocks(getRandomBlockArray(random, featureTypes, modifiersForFeature, FeatureType.FEATURE_HUGELIQUIDORBS, false));
dimensionInformation.setHugeLiquidSphereFluids(getRandomFluidArray(random, dimensionInformation, featureTypes, modifiersForFeature, FeatureType.FEATURE_HUGELIQUIDORBS, false));
dimensionInformation.setCanyonBlock(dimensionInformation.getFeatureBlock(random, modifiersForFeature, FeatureType.FEATURE_CANYONS));
}
use of mcjty.rftools.dimension.world.types.TerrainType 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.TerrainType in project RFTools by McJty.
the class TerrainDimletType method constructDimension.
@Override
public void constructDimension(List<Pair<DimletKey, List<DimletKey>>> dimlets, Random random, DimensionInformation dimensionInformation) {
dimlets = DimensionInformation.extractType(DimletType.DIMLET_TERRAIN, dimlets);
List<DimletKey> modifiers;
TerrainType terrainType = TerrainType.TERRAIN_VOID;
if (dimlets.isEmpty()) {
// Pick a random terrain type with a seed that is generated from all the
// dimlets so we always get the same random value for these dimlets.
List<DimletKey> idList = new ArrayList<DimletKey>(DimletObjectMapping.idToTerrainType.keySet());
DimletKey key = idList.get(random.nextInt(idList.size()));
dimensionInformation.updateCostFactor(key);
terrainType = DimletObjectMapping.idToTerrainType.get(key);
modifiers = Collections.emptyList();
} else {
int index = random.nextInt(dimlets.size());
DimletKey key = dimlets.get(index).getLeft();
terrainType = DimletObjectMapping.idToTerrainType.get(key);
modifiers = dimlets.get(index).getRight();
}
List<BlockMeta> blocks = new ArrayList<BlockMeta>();
List<Block> fluids = new ArrayList<Block>();
DimensionInformation.getMaterialAndFluidModifiers(modifiers, blocks, fluids);
dimensionInformation.setTerrainType(terrainType);
BlockMeta baseBlockForTerrain;
if (dimensionInformation.isPatreonBitSet(Patreons.PATREON_LAYEREDMETA)) {
baseBlockForTerrain = new BlockMeta(Blocks.wool, 127);
} else {
if (!blocks.isEmpty()) {
baseBlockForTerrain = blocks.get(random.nextInt(blocks.size()));
if (baseBlockForTerrain == null) {
// This is the default in case None was specified.
baseBlockForTerrain = BlockMeta.STONE;
}
} else {
// If the terrain type is void we always pick stone as a random material.
if (terrainType == TerrainType.TERRAIN_VOID) {
baseBlockForTerrain = BlockMeta.STONE;
} else if (random.nextFloat() < DimletConfiguration.randomBaseBlockChance) {
DimletKey key = DimletRandomizer.getRandomMaterialBlock(random, false);
dimensionInformation.updateCostFactor(key);
baseBlockForTerrain = DimletObjectMapping.idToBlock.get(key);
} else {
baseBlockForTerrain = BlockMeta.STONE;
}
}
}
dimensionInformation.setBaseBlockForTerrain(baseBlockForTerrain);
Block fluidForTerrain;
if (!fluids.isEmpty()) {
fluidForTerrain = fluids.get(random.nextInt(fluids.size()));
if (fluidForTerrain == null) {
// This is the default.
fluidForTerrain = Blocks.water;
}
} else {
// If the terrain type is void we always pick water as the random liquid.
if (terrainType == TerrainType.TERRAIN_VOID) {
fluidForTerrain = Blocks.water;
} else if (random.nextFloat() < DimletConfiguration.randomOceanLiquidChance) {
DimletKey key = DimletRandomizer.getRandomFluidBlock(random, false);
dimensionInformation.updateCostFactor(key);
fluidForTerrain = DimletObjectMapping.idToFluid.get(key);
} else {
fluidForTerrain = Blocks.water;
}
}
dimensionInformation.setFluidForTerrain(fluidForTerrain);
}
Aggregations