Search in sources :

Example 1 with SpeciesSelection

use of com.ferreusveritas.dynamictrees.api.worldgen.BiomePropertySelectors.SpeciesSelection in project DynamicTrees by DynamicTreesTeam.

the class BiomeDataBasePopulatorJson method registerJsonCapabilities.

public static void registerJsonCapabilities(BiomeDataBaseJsonCapabilityRegistryEvent event) {
    event.register(NAME, jsonElement -> {
        if (jsonElement == null) {
            return b -> false;
        }
        if (jsonElement.isJsonPrimitive() && jsonElement.getAsJsonPrimitive().isString()) {
            return readNameSelector(jsonElement.getAsString());
        } else if (jsonElement.isJsonArray()) {
            return readArrayNameSelector(jsonElement.getAsJsonArray());
        }
        return b -> false;
    });
    event.register(TYPE, jsonElement -> {
        if (jsonElement != null) {
            List<BiomeDictionary.Type> typesWhitelist = new ArrayList<>();
            List<BiomeDictionary.Type> typesBlacklist = new ArrayList<>();
            if (jsonElement.isJsonPrimitive() && jsonElement.getAsJsonPrimitive().isString()) {
                readTypeSelector(jsonElement.getAsString(), typesWhitelist, typesBlacklist);
            } else if (jsonElement.isJsonArray()) {
                readArrayTypeSelector(jsonElement.getAsJsonArray(), typesWhitelist, typesBlacklist);
            }
            // Accept if the biome has any types from the whitelist and no types from the blacklist.
            return b -> biomeHasTypes(b, typesWhitelist) && (typesBlacklist.size() == 0 || !biomeHasAnyType(b, typesBlacklist));
        }
        return b -> false;
    });
    event.register(SPECIES, new JsonBiomePropertyApplierSpecies());
    event.register(DENSITY, new JsonBiomePropertyApplierDensity());
    event.register(CHANCE, new JsonBiomePropertyApplierChance());
    event.register(CANCELVANILLA, (dbase, element, biome) -> {
        if (element.isJsonPrimitive()) {
            boolean cancel = element.getAsBoolean();
            // System.out.println("Biome " + (cancel ? "cancelled" : "uncancelled") + " for vanilla: " + biome);
            dbase.setCancelVanillaTreeGen(biome, cancel);
        }
    });
    event.register(MULTIPASS, (dbase, element, biome) -> {
        if (element.isJsonPrimitive()) {
            boolean multipass = element.getAsBoolean();
            if (multipass) {
                // System.out.println("Biome set for multipass: " + biome);
                // Enable poisson disc multipass of roofed forests to ensure maximum density even with large trees
                // by filling in gaps in the generation with smaller trees
                dbase.setMultipass(biome, pass -> {
                    switch(pass) {
                        case 0:
                            // Zero means to run as normal
                            return 0;
                        case 1:
                            // Return only radius 5 on pass 1
                            return 5;
                        case 2:
                            // Return only radius 3 on pass 2
                            return 3;
                        default:
                            // A negative number means to terminate
                            return -1;
                    }
                });
            }
        }
    });
    event.register(SUBTERRANEAN, (dbase, element, biome) -> {
        if (element.isJsonPrimitive()) {
            boolean subterranean = element.getAsBoolean();
            // System.out.println("Biome set to subterranean: " + biome);
            dbase.setIsSubterranean(biome, subterranean);
        }
    });
    event.register(FORESTNESS, (dbase, element, biome) -> {
        if (element.isJsonPrimitive()) {
            float forestness = element.getAsFloat();
            // System.out.println("Forestness set for biome: " + biome + " at " + forestness);
            dbase.setForestness(biome, forestness);
        }
    });
    event.register(BLACKLIST, (dbase, element, biome) -> {
        if (element.isJsonPrimitive()) {
            boolean blacklist = element.getAsBoolean();
            if (blacklist) {
                // System.out.println("Blacklisted biome: " + biome);
                blacklistedBiomes.add(biome);
            } else {
                blacklistedBiomes.remove(biome);
            }
        }
    });
    event.register(RESET, (dbase, element, biome) -> {
        dbase.setCancelVanillaTreeGen(biome, false);
        dbase.setSpeciesSelector(biome, (pos, dirt, rnd) -> new SpeciesSelection(), Operation.REPLACE);
        dbase.setDensitySelector(biome, (rnd, nd) -> -1, Operation.REPLACE);
        dbase.setChanceSelector(biome, (rnd, spc, rad) -> EnumChance.UNHANDLED, Operation.REPLACE);
        dbase.setForestness(biome, 0.0f);
        dbase.setIsSubterranean(biome, false);
        dbase.setMultipass(biome, pass -> (pass == 0 ? 0 : -1));
    });
}
Also used : JsonObject(com.google.gson.JsonObject) Arrays(java.util.Arrays) HashMap(java.util.HashMap) Operation(com.ferreusveritas.dynamictrees.worldgen.BiomeDataBase.Operation) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) JsonElement(com.google.gson.JsonElement) IJsonBiomeSelector(com.ferreusveritas.dynamictrees.worldgen.json.IJsonBiomeSelector) Lists(com.google.common.collect.Lists) JsonBiomePropertyApplierChance(com.ferreusveritas.dynamictrees.worldgen.json.JsonBiomePropertyApplierChance) BiomeDictionary(net.minecraftforge.common.BiomeDictionary) Map(java.util.Map) EnumChance(com.ferreusveritas.dynamictrees.api.worldgen.BiomePropertySelectors.EnumChance) JsonHelper(com.ferreusveritas.dynamictrees.util.JsonHelper) JsonPrimitive(com.google.gson.JsonPrimitive) LinkedList(java.util.LinkedList) Predicate(java.util.function.Predicate) JsonBiomePropertyApplierSpecies(com.ferreusveritas.dynamictrees.worldgen.json.JsonBiomePropertyApplierSpecies) Set(java.util.Set) Collectors(java.util.stream.Collectors) BiomeDataBaseJsonCapabilityRegistryEvent(com.ferreusveritas.dynamictrees.api.WorldGenRegistry.BiomeDataBaseJsonCapabilityRegistryEvent) IBiomeDataBasePopulator(com.ferreusveritas.dynamictrees.api.worldgen.IBiomeDataBasePopulator) List(java.util.List) JsonArray(com.google.gson.JsonArray) Stream(java.util.stream.Stream) SpeciesSelection(com.ferreusveritas.dynamictrees.api.worldgen.BiomePropertySelectors.SpeciesSelection) JsonBiomePropertyApplierDensity(com.ferreusveritas.dynamictrees.worldgen.json.JsonBiomePropertyApplierDensity) Entry(java.util.Map.Entry) ResourceLocation(net.minecraft.util.ResourceLocation) IJsonBiomeApplier(com.ferreusveritas.dynamictrees.worldgen.json.IJsonBiomeApplier) Biome(net.minecraft.world.biome.Biome) JsonBiomePropertyApplierChance(com.ferreusveritas.dynamictrees.worldgen.json.JsonBiomePropertyApplierChance) SpeciesSelection(com.ferreusveritas.dynamictrees.api.worldgen.BiomePropertySelectors.SpeciesSelection) ArrayList(java.util.ArrayList) JsonBiomePropertyApplierDensity(com.ferreusveritas.dynamictrees.worldgen.json.JsonBiomePropertyApplierDensity) JsonBiomePropertyApplierSpecies(com.ferreusveritas.dynamictrees.worldgen.json.JsonBiomePropertyApplierSpecies)

Example 2 with SpeciesSelection

use of com.ferreusveritas.dynamictrees.api.worldgen.BiomePropertySelectors.SpeciesSelection in project DynamicTrees by DynamicTreesTeam.

the class TreeGenerator method makeTree.

public EnumGeneratorResult makeTree(World world, BiomeDataBase biomeDataBase, PoissonDisc circle, IGroundFinder groundFinder, SafeChunkBounds safeBounds) {
    // Move the circle into the "stage"
    circle.add(8, 8);
    BlockPos pos = new BlockPos(circle.x, 0, circle.z);
    Biome biome = world.getBiome(pos);
    BiomeEntry biomeEntry = biomeDataBase.getEntry(biome);
    pos = groundFinder.findGround(biomeEntry, world, pos);
    if (pos == BlockPos.ORIGIN) {
        return EnumGeneratorResult.NOGROUND;
    }
    random.setXOR(pos);
    IBlockState dirtState = world.getBlockState(pos);
    EnumGeneratorResult result = EnumGeneratorResult.GENERATED;
    SpeciesSelection speciesSelection = biomeEntry.getSpeciesSelector().getSpecies(pos, dirtState, random);
    if (speciesSelection.isHandled()) {
        Species species = speciesSelection.getSpecies();
        if (species.isValid()) {
            if (species.isAcceptableSoilForWorldgen(world, pos, dirtState)) {
                if (biomeEntry.getChanceSelector().getChance(random, species, circle.radius) == EnumChance.OK) {
                    if (species.generate(world, pos, biome, random, circle.radius, safeBounds)) {
                        result = EnumGeneratorResult.GENERATED;
                    } else {
                        result = EnumGeneratorResult.FAILGENERATION;
                    }
                } else {
                    result = EnumGeneratorResult.FAILCHANCE;
                }
            } else {
                result = EnumGeneratorResult.FAILSOIL;
            }
        } else {
            result = EnumGeneratorResult.NOTREE;
        }
    } else {
        result = EnumGeneratorResult.UNHANDLEDBIOME;
    }
    // Display wool circles for testing the circle growing algorithm
    if (ModConfigs.worldGenDebug) {
        makeWoolCircle(world, circle, pos.getY(), result, safeBounds);
    }
    // Move the circle back to normal coords
    circle.add(-8, -8);
    return result;
}
Also used : BiomeEntry(com.ferreusveritas.dynamictrees.worldgen.BiomeDataBase.BiomeEntry) Biome(net.minecraft.world.biome.Biome) IBlockState(net.minecraft.block.state.IBlockState) SpeciesSelection(com.ferreusveritas.dynamictrees.api.worldgen.BiomePropertySelectors.SpeciesSelection) BlockPos(net.minecraft.util.math.BlockPos) Species(com.ferreusveritas.dynamictrees.trees.Species)

Aggregations

SpeciesSelection (com.ferreusveritas.dynamictrees.api.worldgen.BiomePropertySelectors.SpeciesSelection)2 Biome (net.minecraft.world.biome.Biome)2 BiomeDataBaseJsonCapabilityRegistryEvent (com.ferreusveritas.dynamictrees.api.WorldGenRegistry.BiomeDataBaseJsonCapabilityRegistryEvent)1 EnumChance (com.ferreusveritas.dynamictrees.api.worldgen.BiomePropertySelectors.EnumChance)1 IBiomeDataBasePopulator (com.ferreusveritas.dynamictrees.api.worldgen.IBiomeDataBasePopulator)1 Species (com.ferreusveritas.dynamictrees.trees.Species)1 JsonHelper (com.ferreusveritas.dynamictrees.util.JsonHelper)1 BiomeEntry (com.ferreusveritas.dynamictrees.worldgen.BiomeDataBase.BiomeEntry)1 Operation (com.ferreusveritas.dynamictrees.worldgen.BiomeDataBase.Operation)1 IJsonBiomeApplier (com.ferreusveritas.dynamictrees.worldgen.json.IJsonBiomeApplier)1 IJsonBiomeSelector (com.ferreusveritas.dynamictrees.worldgen.json.IJsonBiomeSelector)1 JsonBiomePropertyApplierChance (com.ferreusveritas.dynamictrees.worldgen.json.JsonBiomePropertyApplierChance)1 JsonBiomePropertyApplierDensity (com.ferreusveritas.dynamictrees.worldgen.json.JsonBiomePropertyApplierDensity)1 JsonBiomePropertyApplierSpecies (com.ferreusveritas.dynamictrees.worldgen.json.JsonBiomePropertyApplierSpecies)1 Lists (com.google.common.collect.Lists)1 JsonArray (com.google.gson.JsonArray)1 JsonElement (com.google.gson.JsonElement)1 JsonObject (com.google.gson.JsonObject)1 JsonPrimitive (com.google.gson.JsonPrimitive)1 ArrayList (java.util.ArrayList)1