finish terrain generation

This commit is contained in:
2021-05-06 17:15:07 +08:00
parent d8d90c3cb4
commit b68cb9114b
28 changed files with 715 additions and 59 deletions

View File

@ -3,78 +3,204 @@ package net.yyc12345.teyvatcraft.init;
import net.minecraft.util.registry.BuiltinRegistries;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryKey;
import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
import net.fabricmc.fabric.api.biome.v1.BiomeSelectors;
import java.util.function.Predicate;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
import net.fabricmc.fabric.api.biome.v1.BiomeSelectionContext;
import net.fabricmc.fabric.api.biome.v1.BiomeSelectors;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.util.Identifier;
import net.minecraft.world.biome.BiomeKeys;
import net.minecraft.world.gen.GenerationStep;
import net.minecraft.world.gen.decorator.Decorator;
import net.minecraft.world.gen.decorator.RangeDecoratorConfig;
import net.minecraft.world.gen.feature.ConfiguredFeature;
import net.minecraft.world.gen.feature.ConfiguredFeatures;
import net.minecraft.world.gen.feature.Feature;
import net.minecraft.world.gen.feature.OreFeatureConfig;
import net.minecraft.world.gen.feature.RandomPatchFeatureConfig;
import net.minecraft.world.gen.feature.ConfiguredFeatures.Decorators;
import net.minecraft.world.gen.placer.BlockPlacer;
import net.minecraft.world.gen.placer.SimpleBlockPlacer;
import net.minecraft.world.gen.stateprovider.BlockStateProvider;
import net.minecraft.world.gen.stateprovider.SimpleBlockStateProvider;
import net.minecraft.world.gen.stateprovider.WeightedBlockStateProvider;
import net.yyc12345.teyvatcraft.mixin.FlowerForestAccess;
public class TerrainsManager {
private static final Block[] NORMAL__FLOWERS = new Block[] {
BlocksManager.DANDELION_SEED,
BlocksManager.SMALL_LAMP_GRASS,
BlocksManager.MINT,
BlocksManager.SWEET_FLOWER,
BlocksManager.MATSUTAKE,
BlocksManager.GLAZE_LILY,
BlocksManager.PHILANEMO_MUSHROOM,
BlocksManager.WINDWHEEL_ASTER
};
private static final Block[] SWAMP__FLOWERS = new Block[] {
BlocksManager.CALLA_LILY,
BlocksManager.SNAPDRAGON,
BlocksManager.HORSETAIL
};
private static final Block[] MOUNTAINS__FLOWERS = new Block[] {
BlocksManager.CECILIA,
BlocksManager.QINGXIN
};
private static final Block[] NORMAL__SWEET_BERRY_BUSH = new Block[] {
BlocksManager.JUEYUN_CHILI,
BlocksManager.BERRY,
BlocksManager.SILK_FLOWER,
BlocksManager.VALBERRY,
BlocksManager.WOLFHOOK,
};
// ==================== ore gen
private static ConfiguredFeature<?, ?> OREGEN_MAGICAL_CRYSTAL_CHUNK_ORE = Feature.ORE
.configure(new OreFeatureConfig(
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
BlocksManager.MAGICAL_CRYSTAL_CHUNK_ORE.getDefaultState(),
1)) // vein size
.decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(0, 0, 12)))
.spreadHorizontally()
.repeat(5); // number of veins per chunk
private static ConfiguredFeature<?, ?> OREGEN_MAGICAL_CRYSTAL_CHUNK_ORE = generateOreFreature(2, 12, 5, BlocksManager.MAGICAL_CRYSTAL_CHUNK_ORE);
private static ConfiguredFeature<?, ?> OREGEN_CRYSTAL_CHUNK_ORE = generateOreFreature(4, 32, 12, BlocksManager.CRYSTAL_CHUNK_ORE);
private static ConfiguredFeature<?, ?> OREGEN_WHITE_IRON_CHUNK_ORE = generateOreFreature(4, 64, 24, BlocksManager.WHITE_IRON_CHUNK_ORE);
private static ConfiguredFeature<?, ?> OREGEN_IRON_CHUNK_ORE = generateOreFreature(8, 64, 24, BlocksManager.IRON_CHUNK_ORE);
private static ConfiguredFeature<?, ?> OREGEN_STARSILVER_ORE = generateOreFreature(4, 64, 24, BlocksManager.STARSILVER_ORE);
private static ConfiguredFeature<?, ?> OREGEN_NOCTILUCOUS_JADE_ORE = generateOreFreature(4, 64, 24, BlocksManager.NOCTILUCOUS_JADE_ORE);
private static ConfiguredFeature<?, ?> OREGEN_COR_LAPIS_ORE = generateOreFreature(4, 64, 24, BlocksManager.COR_LAPIS_ORE);
private static ConfiguredFeature<?, ?> OREGEN_CRYSTAL_CHUNK_ORE = Feature.ORE
.configure(new OreFeatureConfig(
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
BlocksManager.CRYSTAL_CHUNK_ORE.getDefaultState(),
4))
.decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(0, 0, 32)))
.spreadHorizontally()
.repeat(12);
private static ConfiguredFeature<?, ?> FLOWERGEN_NORMAL = generateFlowerLikePlantFreature(NORMAL__FLOWERS);
private static ConfiguredFeature<?, ?> FLOWERGEN_SWAMP = generateFlowerLikePlantFreature(SWAMP__FLOWERS);
private static ConfiguredFeature<?, ?> FLOWERGEN_MOUNTAINS = generateFlowerLikePlantFreature(MOUNTAINS__FLOWERS);
private static ConfiguredFeature<?, ?> SBBGEN_NORMAL = generateSweetBerryBushLikePlantFreature(NORMAL__SWEET_BERRY_BUSH);
private static ConfiguredFeature<?, ?> OREGEN_WHITE_IRON_CHUNK_ORE = Feature.ORE
.configure(new OreFeatureConfig(
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
BlocksManager.WHITE_IRON_CHUNK_ORE.getDefaultState(),
4))
.decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(0, 0, 64)))
.spreadHorizontally()
.repeat(24);
// ================ feature generator
private static ConfiguredFeature<?, ?> generateOreFreature(int veinSize, int maxY, int repeat, Block blk) {
return Feature.ORE
.configure(new OreFeatureConfig(
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
blk.getDefaultState(),
veinSize))
.rangeOf(maxY)
.spreadHorizontally()
.repeat(repeat);
}
private static ConfiguredFeature<?, ?> generateFlowerLikePlantFreature(Block[] flowerBlks) {
WeightedBlockStateProvider provider = new WeightedBlockStateProvider();
for(Block item : flowerBlks) {
provider.addState(item.getDefaultState(), 1);
}
private static ConfiguredFeature<?, ?> OREGEN_IRON_CHUNK_ORE = Feature.ORE
.configure(new OreFeatureConfig(
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
BlocksManager.IRON_CHUNK_ORE.getDefaultState(),
8))
.decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(0, 0, 64)))
.spreadHorizontally()
.repeat(24);
return Feature.FLOWER
.configure((new RandomPatchFeatureConfig.Builder(
(BlockStateProvider)provider,
(BlockPlacer)SimpleBlockPlacer.INSTANCE))
.tries(64)
.build())
.decorate(Decorators.SPREAD_32_ABOVE)
.decorate(Decorators.SQUARE_HEIGHTMAP)
.repeat(2);
}
private static ConfiguredFeature<?, ?> generateSweetBerryBushLikePlantFreature(Block[] plantBlks) {
WeightedBlockStateProvider provider = new WeightedBlockStateProvider();
for(Block item : plantBlks) {
provider.addState(item.getDefaultState(), 1);
}
private static ConfiguredFeature<?, ?> OREGEN_STARSILVER_ORE = Feature.ORE
.configure(new OreFeatureConfig(
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
BlocksManager.IRON_CHUNK_ORE.getDefaultState(),
4))
.decorate(Decorator.RANGE.configure(new RangeDecoratorConfig(0, 0, 64)))
.spreadHorizontally()
.repeat(24);
return Feature.RANDOM_PATCH
.configure((new RandomPatchFeatureConfig.Builder(
(BlockStateProvider)provider,
(BlockPlacer)SimpleBlockPlacer.INSTANCE))
.tries(64)
.whitelist((Set<Block>)ImmutableSet.of(Blocks.GRASS_BLOCK))
.cannotProject()
.build());
}
private static void registerOreGeneration(String mIdentifier, ConfiguredFeature<?, ?> genStasticas) {
// ================ biome register
private static Predicate<BiomeSelectionContext> getAllBiomeSelector() {
return BiomeSelectors.foundInOverworld();
}
private static Predicate<BiomeSelectionContext> getMountainsBiomeSelector() {
return BiomeSelectors.includeByKey(
BiomeKeys.MOUNTAINS,
BiomeKeys.GRAVELLY_MOUNTAINS,
BiomeKeys.WOODED_MOUNTAINS,
BiomeKeys.MODIFIED_GRAVELLY_MOUNTAINS
);
}
private static Predicate<BiomeSelectionContext> getSwampBiomeSelector() {
return BiomeSelectors.includeByKey(
BiomeKeys.SWAMP,
BiomeKeys.SWAMP_HILLS
);
}
private static Predicate<BiomeSelectionContext> getBadlandsBiomeSelector() {
return BiomeSelectors.includeByKey(
BiomeKeys.BADLANDS,
BiomeKeys.ERODED_BADLANDS,
BiomeKeys.WOODED_BADLANDS_PLATEAU,
BiomeKeys.MODIFIED_BADLANDS_PLATEAU,
BiomeKeys.BADLANDS_PLATEAU
);
}
private static Predicate<BiomeSelectionContext> getFrozenBiomeSelector() {
return BiomeSelectors.includeByKey(
BiomeKeys.SNOWY_TUNDRA,
BiomeKeys.ICE_SPIKES,
BiomeKeys.SNOWY_TAIGA,
BiomeKeys.SNOWY_TAIGA_MOUNTAINS,
BiomeKeys.FROZEN_RIVER,
BiomeKeys.SNOWY_BEACH,
BiomeKeys.SNOWY_MOUNTAINS
);
}
private static void registerOreGeneration(String mIdentifier, ConfiguredFeature<?, ?> genFeature, Predicate<BiomeSelectionContext> biomeSelector) {
RegistryKey<ConfiguredFeature<?, ?>> regKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN,
new Identifier("teyvatcraft", mIdentifier));
Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, regKey.getValue(), genStasticas);
BiomeModifications.addFeature(BiomeSelectors.foundInOverworld(), GenerationStep.Feature.UNDERGROUND_ORES, regKey);
Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, regKey.getValue(), genFeature);
BiomeModifications.addFeature(biomeSelector, GenerationStep.Feature.UNDERGROUND_ORES, regKey);
}
private static void registerPlantGeneration(String mIdentifier, ConfiguredFeature<?, ?> genFeature, Predicate<BiomeSelectionContext> biomeSelector) {
RegistryKey<ConfiguredFeature<?, ?>> regKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN,
new Identifier("teyvatcraft", mIdentifier));
Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, regKey.getValue(), genFeature);
BiomeModifications.addFeature(biomeSelector, GenerationStep.Feature.VEGETAL_DECORATION, regKey);
}
public static void RegisterAll() {
// ore gen
registerOreGeneration("oregen_magical_crystal_ore", OREGEN_MAGICAL_CRYSTAL_CHUNK_ORE);
registerOreGeneration("oregen_crystal_ore", OREGEN_CRYSTAL_CHUNK_ORE);
registerOreGeneration("oregen_white_iron_ore", OREGEN_WHITE_IRON_CHUNK_ORE);
registerOreGeneration("oregen_iron_ore", OREGEN_IRON_CHUNK_ORE);
registerOreGeneration("oregen_starsilver_ore", OREGEN_STARSILVER_ORE);
registerOreGeneration("oregen_magical_crystal_ore", OREGEN_MAGICAL_CRYSTAL_CHUNK_ORE, getAllBiomeSelector());
registerOreGeneration("oregen_crystal_ore", OREGEN_CRYSTAL_CHUNK_ORE, getAllBiomeSelector());
registerOreGeneration("oregen_white_iron_ore", OREGEN_WHITE_IRON_CHUNK_ORE, getAllBiomeSelector());
registerOreGeneration("oregen_iron_ore", OREGEN_IRON_CHUNK_ORE, getAllBiomeSelector());
registerOreGeneration("oregen_starsilver_ore", OREGEN_STARSILVER_ORE, getFrozenBiomeSelector());
registerOreGeneration("oregen_noctilucous_jade_ore", OREGEN_NOCTILUCOUS_JADE_ORE, getBadlandsBiomeSelector());
registerOreGeneration("oregen_cor_lapis_ore", OREGEN_COR_LAPIS_ORE, getBadlandsBiomeSelector());
// flower gen
registerPlantGeneration("flowergen_normal", FLOWERGEN_NORMAL, getAllBiomeSelector());
registerPlantGeneration("flowergen_swamp", FLOWERGEN_SWAMP, getSwampBiomeSelector());
registerPlantGeneration("flowergen_mountains", FLOWERGEN_MOUNTAINS, getMountainsBiomeSelector());
registerPlantGeneration("sbbgen_normal", SBBGEN_NORMAL, getAllBiomeSelector());
// patch flower forest
BlockState[] flowerForestArray = FlowerForestAccess.getFlowers();
List<BlockState> flowerForestList = new ArrayList<BlockState>();
for(BlockState item : flowerForestArray) {
flowerForestList.add(item);
}
for(Block item : NORMAL__FLOWERS) {
flowerForestList.add(item.getDefaultState());
}
BlockState[] newFlowerForestArray = flowerForestList.toArray(new BlockState[flowerForestList.size()]);
FlowerForestAccess.setFlowers(newFlowerForestArray);
}
}

View File

@ -0,0 +1,20 @@
package net.yyc12345.teyvatcraft.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.block.BlockState;
import net.minecraft.world.gen.stateprovider.ForestFlowerBlockStateProvider;
@Mixin(ForestFlowerBlockStateProvider.class)
public interface FlowerForestAccess {
@Accessor("FLOWERS")
static BlockState[] getFlowers() {
throw new AssertionError();
}
@Accessor("FLOWERS")
static void setFlowers(BlockState[] items) {
throw new AssertionError();
}
}

View File

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "teyvatcraft:block/cor_lapis_ore"
}
}
}

View File

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "teyvatcraft:block/noctilucous_jade_ore"
}
}
}

View File

@ -34,6 +34,8 @@
"block.teyvatcraft.white_iron_chunk_ore": "White Iron Chunk Ore",
"block.teyvatcraft.iron_chunk_ore": "Iron Chunk Ore",
"block.teyvatcraft.starsilver_ore": "Starsilver Ore",
"block.teyvatcraft.cor_lapis_ore": "Cor Lapis Ore",
"block.teyvatcraft.noctilucous_jade_ore": "Noctilucous Jade Ore",
"block.teyvatcraft.rice": "Rice",
"block.teyvatcraft.tomato": "Tomato",

View File

@ -34,6 +34,8 @@
"block.teyvatcraft.white_iron_chunk_ore": "白铁块原矿",
"block.teyvatcraft.iron_chunk_ore": "铁块原矿",
"block.teyvatcraft.starsilver_ore": "星银矿石原矿",
"block.teyvatcraft.cor_lapis_ore": "石珀原矿",
"block.teyvatcraft.noctilucous_jade_ore": "夜泊石原矿",
"block.teyvatcraft.rice": "稻米",
"block.teyvatcraft.tomato": "番茄",

View File

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "teyvatcraft:block/cor_lapis_ore"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "teyvatcraft:block/noctilucous_jade_ore"
}
}

View File

@ -0,0 +1,3 @@
{
"parent": "teyvatcraft:block/cor_lapis_ore"
}

View File

@ -0,0 +1,3 @@
{
"parent": "teyvatcraft:block/noctilucous_jade_ore"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 617 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 B

View File

@ -32,8 +32,8 @@
{
"function": "minecraft:set_count",
"count": {
"min": 4.0,
"max": 5.0,
"min": 1.0,
"max": 2.0,
"type": "minecraft:uniform"
}
},
@ -56,4 +56,4 @@
]
}
]
}
}

View File

@ -32,8 +32,8 @@
{
"function": "minecraft:set_count",
"count": {
"min": 4.0,
"max": 5.0,
"min": 1.0,
"max": 2.0,
"type": "minecraft:uniform"
}
},
@ -56,4 +56,4 @@
]
}
]
}
}

View File

@ -7,7 +7,8 @@
],
"client": [
"TeyvatCraftMixin",
"VillagerAccess"
"VillagerAccess",
"FlowerForestAccess"
],
"injectors": {
"defaultRequire": 1