大佬们晚上好,我在尝试为 spigot1.14.4 编写一个自定义的世界生成器,但是在尝试平滑Biome连接时遇到了问题:
我的逻辑是:每一个Biome有最低高度和额外高度上限。我使用了SpigotAPI的Octave生成器,就可生成高度在(0~1的随机数)*额外高度上限 + 最低高度 的地形。比如我设置沙漠的最低高度为80,额外高度上限为6,那么生成的地形即在高度80~86之间。这个高度我称之为"当前高度"
这个方案会使相邻Biome之间的地形落差巨大,所以我需要将Biome之间的地形平整。
我自己的方案是:对于每一个XZ坐标,收集它附近某一范围(我设定的范围是XZ坐标差之和小于等于10)的Biome信息,并且将坐标信息不重复地记录为(Biome:最短距离distance)的格式。
举个例子,假如一个方块处于沙漠Biome,但其附近10格内有河流(最短距离3),平原(最短距离4),则记录为:
沙漠:0(它距自身肯定是0格)
河流:3
平原:4
之后,收集这些Biome的对应最低高度(我提前设定好了),并通过加权平均的算法,求出最终的"当前高度"
问题就出在这里:如果要使用我的方法,就势必要获取此区块之外的方块的Biome信息,(因为如果当前方块处于区块边缘,获取临近方块的Biome信息就一定要跨区块)所以不能使用基于此区块的getBiome()方法,而要使用基于全地图的getBiome()方法。 然而,当我确实使用了world.getBiome(x坐标,z坐标)时,服务器开服时卡在了Preparing chunk data 0%,并且进度不再增加,也没有报错,cpu利用率接近于零。我个人判断是world.getBiome在开服阶段还不可用,导致此问题的出现。
所以我想请问各位大佬:
1、如果有可能的话,可否帮我指出一种更佳的平滑Biome的方法?我目前的方法就算能够运行,对算力也有不小的负荷,所以如果从根本逻辑上改变算法,那就谢天谢地了。
2、如果大佬们也不清楚更好的平滑Biome方法,那么请问该如何解决现在我无法获取当前区块外的方块的Biome的信息?
万分感谢!!!!!(当然如果大佬有相关教程的传送门,我也十分感谢,我只在谷歌上搜索了相关教程,但是没有找到想要的东西。)
以下是我生成器的代码部分:
复制代码
我的逻辑是:每一个Biome有最低高度和额外高度上限。我使用了SpigotAPI的Octave生成器,就可生成高度在(0~1的随机数)*额外高度上限 + 最低高度 的地形。比如我设置沙漠的最低高度为80,额外高度上限为6,那么生成的地形即在高度80~86之间。这个高度我称之为"当前高度"
这个方案会使相邻Biome之间的地形落差巨大,所以我需要将Biome之间的地形平整。
我自己的方案是:对于每一个XZ坐标,收集它附近某一范围(我设定的范围是XZ坐标差之和小于等于10)的Biome信息,并且将坐标信息不重复地记录为(Biome:最短距离distance)的格式。
举个例子,假如一个方块处于沙漠Biome,但其附近10格内有河流(最短距离3),平原(最短距离4),则记录为:
沙漠:0(它距自身肯定是0格)
河流:3
平原:4
之后,收集这些Biome的对应最低高度(我提前设定好了),并通过加权平均的算法,求出最终的"当前高度"
问题就出在这里:如果要使用我的方法,就势必要获取此区块之外的方块的Biome信息,(因为如果当前方块处于区块边缘,获取临近方块的Biome信息就一定要跨区块)所以不能使用基于此区块的getBiome()方法,而要使用基于全地图的getBiome()方法。 然而,当我确实使用了world.getBiome(x坐标,z坐标)时,服务器开服时卡在了Preparing chunk data 0%,并且进度不再增加,也没有报错,cpu利用率接近于零。我个人判断是world.getBiome在开服阶段还不可用,导致此问题的出现。
所以我想请问各位大佬:
1、如果有可能的话,可否帮我指出一种更佳的平滑Biome的方法?我目前的方法就算能够运行,对算力也有不小的负荷,所以如果从根本逻辑上改变算法,那就谢天谢地了。
2、如果大佬们也不清楚更好的平滑Biome方法,那么请问该如何解决现在我无法获取当前区块外的方块的Biome的信息?
万分感谢!!!!!(当然如果大佬有相关教程的传送门,我也十分感谢,我只在谷歌上搜索了相关教程,但是没有找到想要的东西。)
以下是我生成器的代码部分:
- package tech.yfshadaow;
- import org.bukkit.generator.ChunkGenerator;
- import org.bukkit.Bukkit;
- import org.bukkit.World;
- import java.util.Random;
- import org.bukkit.util.noise.SimplexOctaveGenerator;
- import org.bukkit.Material;
- import org.bukkit.block.Biome;
- import java.util.List;
- import java.util.ArrayList;
- import java.lang.Math;
- public class EasternCraftGenerator extends ChunkGenerator{
- int currentHeight = 80;//初始化高度
- @Override
- public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) {
- SimplexOctaveGenerator generator = new SimplexOctaveGenerator(new Random(world.getSeed()), 8);//创建地形起伏生成器
- ChunkData chunk = createChunkData(world);
- generator.setScale(0.02D);//生成器设定参数
- for (int X = 0; X < 16; X++)
- for (int Z = 0; Z < 16; Z++) {//遍历区块的每一个X、Z坐标
- int baseHeight = 80;//初始化最低高度
- int extraHeight = 5;//初始化额外高度最大值
- Material surfaceBlock = Material.GRASS_BLOCK;//设置顶部方块
- Material subSurfaceBLock = Material.DIRT;//设置顶部下方块
- if (biome.getBiome(X,Z).equals(Biome.DESERT)) {baseHeight = 80; extraHeight = 5; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
- else if (biome.getBiome(X,Z).equals(Biome.DESERT_HILLS)) {baseHeight = 80; extraHeight = 40; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
- else if (biome.getBiome(X,Z).equals(Biome.RIVER)) {baseHeight = 70; extraHeight = 2; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
- else if (biome.getBiome(X,Z).equals(Biome.OCEAN)) {baseHeight = 50; extraHeight = 6; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
- else if (biome.getBiome(X,Z).equals(Biome.MOUNTAINS)) {baseHeight = 64; extraHeight = 128; surfaceBlock = Material.GRASS_BLOCK; subSurfaceBLock = Material.DIRT;}//设置biome参数的暂时性代码,以后会改
- currentHeight = (int) (generator.noise(chunkX*16+X, chunkZ*16+Z, 0.3D, 0.3D)*((extraHeight + 1)/2)+baseHeight);//高度=生成的(0~1)随机数 * 额外高度最大值 + 最低高度
- List<Biome> biomesInfo = new ArrayList<Biome>();//初始化平滑区块要用的区块列表
- List<Double> distancesInfo = new ArrayList<Double>();//初始化平滑区块要用的距离列表
- for (int p = 0; p < 10; p++) {
- for (int q = -p; q <= p; q++) {//以上两行起到的作用是,以(|x坐标差值|+|z坐标差值|)从小到大为顺序,遍历当前方块周围的 正方形范围的所有方块
- if (!(biomesInfo.contains(world.getBiome(chunkX*16+X + q, chunkZ*16+Z + (p - Math.abs(q)))))) {
- biomesInfo.add(world.getBiome(chunkX*16+X + q, chunkZ*16+Z + (p - Math.abs(q))));
- distancesInfo.add(Math.sqrt((double)(q ^ 2 + (p - Math.abs(q)) ^ 2)));//计算直线距离
- }
- if (!(biomesInfo.contains(world.getBiome(chunkX*16+X + q, chunkZ*16+Z - (p - Math.abs(q)))))) {
- biomesInfo.add(world.getBiome(chunkX*16+X + q, chunkZ*16+Z - (p - Math.abs(q))));
- distancesInfo.add(Math.sqrt((double)(q ^ 2 + (p - Math.abs(q)) ^ 2)));//计算直线距离
- }
- }
- }
- currentHeight = getCurrentHeight(currentHeight, biomesInfo, distancesInfo);
- //这一整段代码,会把这个方块附近一定范围内存在的biome不重复地记录下来,并且记录下该biome距离当前方块的最短距离(这个距离可能不是最短,但是离最短差不多,没有很大影响)
-
-
-
-
-
- chunk.setBlock(X, currentHeight, Z, surfaceBlock);
- for (int c = 1; c < 9; c++) {
- chunk.setBlock(X, currentHeight-c, Z, subSurfaceBLock);
- }
- for (int i = currentHeight-9; i > 0; i--)
- chunk.setBlock(X, i, Z, Material.STONE);
- chunk.setBlock(X, 0, Z, Material.BEDROCK);
- if (currentHeight < 80) {
- for(int n = 80; n > currentHeight; n--) {
- chunk.setBlock(X, n, Z, Material.WATER);
- }
- }//以上代码放置相应方块和水
- }
- return chunk;
- }
- public int getCurrentHeight(int currentHeight, List<Biome> biomesInfo, List<Double> distancesInfo) {
- double weightSum = 0;
- double numerator = 0;
- for (int i = 0; i < biomesInfo.size(); i++) {
- weightSum += (10 - distancesInfo.get(i));
- numerator += (10 - distancesInfo.get(i)) * ((getBiomeBaseHeight(biomesInfo.get(i))) - (currentHeight));
- }
- return (int)(numerator / weightSum + currentHeight);
- }
- public int getBiomeBaseHeight(Biome biome) {//此方法用来获取biome的最低高度
- if (biome.equals(Biome.DESERT)) {return 80;}
- else if (biome.equals(Biome.DESERT_HILLS)) {return 80;}
- else if (biome.equals(Biome.RIVER)) {return 70;}
- else if (biome.equals(Biome.OCEAN)) {return 50;}
- else if (biome.equals(Biome.MOUNTAINS)) {return 64;}
- else {return 80;}
- }
-
- }
最好的方法是使用GenLayer,让MC自动分配生物群系
以1.15.2为例(不同版本略有不同)
复制代码
以1.15.2为例(不同版本略有不同)
- public class CustomChunkProvider extends WorldChunkManager {
- private final GenLayer layer;
-
- private static final Set<BiomeBase> e = (Set<BiomeBase>)ImmutableSet.of(Biomes.OCEAN, Biomes.PLAINS, Biomes.DESERT, Biomes.MOUNTAINS, Biomes.FOREST, Biomes.TAIGA, (Object[])new BiomeBase[] {
- Biomes.SWAMP, Biomes.RIVER, Biomes.FROZEN_OCEAN, Biomes.FROZEN_RIVER, Biomes.SNOWY_TUNDRA, Biomes.SNOWY_MOUNTAINS, Biomes.MUSHROOM_FIELDS, Biomes.MUSHROOM_FIELD_SHORE, Biomes.BEACH, Biomes.DESERT_HILLS,
- Biomes.WOODED_HILLS, Biomes.TAIGA_HILLS, Biomes.MOUNTAIN_EDGE, Biomes.JUNGLE, Biomes.JUNGLE_HILLS, Biomes.JUNGLE_EDGE, Biomes.DEEP_OCEAN, Biomes.STONE_SHORE, Biomes.SNOWY_BEACH, Biomes.BIRCH_FOREST,
- Biomes.BIRCH_FOREST_HILLS, Biomes.DARK_FOREST, Biomes.SNOWY_TAIGA, Biomes.SNOWY_TAIGA_HILLS, Biomes.GIANT_TREE_TAIGA, Biomes.GIANT_TREE_TAIGA_HILLS, Biomes.WOODED_MOUNTAINS, Biomes.SAVANNA, Biomes.SAVANNA_PLATEAU, Biomes.BADLANDS,
- Biomes.WOODED_BADLANDS_PLATEAU, Biomes.BADLANDS_PLATEAU, Biomes.WARM_OCEAN, Biomes.LUKEWARM_OCEAN, Biomes.COLD_OCEAN, Biomes.DEEP_WARM_OCEAN, Biomes.DEEP_LUKEWARM_OCEAN, Biomes.DEEP_COLD_OCEAN, Biomes.DEEP_FROZEN_OCEAN, Biomes.SUNFLOWER_PLAINS,
- Biomes.DESERT_LAKES, Biomes.GRAVELLY_MOUNTAINS, Biomes.FLOWER_FOREST, Biomes.TAIGA_MOUNTAINS, Biomes.SWAMP_HILLS, Biomes.ICE_SPIKES, Biomes.MODIFIED_JUNGLE, Biomes.MODIFIED_JUNGLE_EDGE, Biomes.TALL_BIRCH_FOREST, Biomes.TALL_BIRCH_HILLS,
- Biomes.DARK_FOREST_HILLS, Biomes.SNOWY_TAIGA_MOUNTAINS, Biomes.GIANT_SPRUCE_TAIGA, Biomes.GIANT_SPRUCE_TAIGA_HILLS, Biomes.MODIFIED_GRAVELLY_MOUNTAINS, Biomes.SHATTERED_SAVANNA, Biomes.SHATTERED_SAVANNA_PLATEAU, Biomes.ERODED_BADLANDS, Biomes.MODIFIED_WOODED_BADLANDS_PLATEAU, Biomes.MODIFIED_BADLANDS_PLATEAU });
- //此处加入你想生成的群系
-
- public CustomChunkProvider(long seed, net.minecraft.server.v1_15_R1.WorldType worldType) {
- super(e);
- this.layer = GenLayers.a(seed, worldType, new GeneratorSettingsOverworld());
- }
-
- public Biome getBiome(int var0, int var1, int var2) {
- BiomeBase base = this.layer.a(var0, var2);
- return CraftBlock.biomeBaseToBiome(base);
- }
- }
疾风暗影 发表于 2020-5-31 01:38
最好的方法是使用GenLayer,让MC自动分配生物群系
以1.15.2为例(不同版本略有不同)
十分感谢!!!
疾风暗影 发表于 2020-5-31 01:38
最好的方法是使用GenLayer,让MC自动分配生物群系
以1.15.2为例(不同版本略有不同)
大佬你好,我仔细读了一下你提供的代码,然后对照了一下我自己的,发现我使用的是 org.bukkit.generator 包中的 ChunkGenerator 类,而你代码中好像需要用到 net.minecraft.server.v1_14_R1 包中的 ChunkGenerator 类。(org.bukkit.generator.ChunkGenerator 没有 WorldChunkManager 等相关内容)
可否问一下您是建议我使用MC原版服务端完全重写一遍代码,还是保留现在的部分代码,通过某种方式调用原版当中的getBiome()方法呢?感谢!
renzd2001 发表于 2020-5-31 10:26
大佬你好,我仔细读了一下你提供的代码,然后对照了一下我自己的,发现我使用的是 org.bukkit.generator ...
这是调用nms的方法,用mc自己的层级噪声生成优化的群系分布
你可以地形生成用自己的代码,群系生成用这些
疾风暗影 发表于 2020-5-31 10:29
这是调用nms的方法,用mc自己的层级噪声生成优化的群系分布
你可以地形生成用自己的代码,群系生成用这 ...
大佬你好,我用了你给的代码,已经可以正常生成世界了,但是在判断生物群系时出了点小问题:
我原本判断生物群系使用的是spigot自带的 BiomeGrid.getBiome()方法,因为这个方法限于当前区块,所以X和Z坐标参数都是 0~15
现在我改用你给我的使用实例化的WorldChunkManager的方法,我认为这个方法应该是基于整个地图,所以我将原来的这部分判断代码
- if (biome.getBiome(X,Z).equals(Biome.DESERT)) {baseHeight = 80; extraHeight = 5; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
- else if (biome.getBiome(X,Z).equals(Biome.DESERT_HILLS)) {baseHeight = 80; extraHeight = 40; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
- else if (biome.getBiome(X,Z).equals(Biome.RIVER)) {baseHeight = 70; extraHeight = 2; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
- else if (biome.getBiome(X,Z).equals(Biome.OCEAN)) {baseHeight = 50; extraHeight = 6; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
- else if (biome.getBiome(X,Z).equals(Biome.MOUNTAINS)) {baseHeight = 64; extraHeight = 128; surfaceBlock = Material.GRASS_BLOCK; subSurfaceBLock = Material.DIRT;}
- if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.DESERT)) {baseHeight = 83; extraHeight = 3; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
- else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.DESERT_HILLS)) {baseHeight = 100; extraHeight = 20; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
- else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.RIVER)) {baseHeight = 70; extraHeight = 1; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
- else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.OCEAN)) {baseHeight = 50; extraHeight = 3; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
- else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.MOUNTAINS)) {baseHeight = 128; extraHeight = 64; surfaceBlock = Material.GRASS_BLOCK; subSurfaceBLock = Material.DIRT;}
请问我该怎么解决这个问题?
我认为我可能犯的错误:
1、我在转换区块内坐标和世界内坐标时出错(但我记得确实应该是chunkX*16+X, chunkZ*16+Z)
2、mc原版生成的Biome分布和spigot根本就不一样(这个不应该发生啊,spigot应该用的就是原版的生成器)(然而这个可以通过使用spigot自带的setBiome来间接解决)
以下为生成器部分代码:(我暂时删掉了平整地形的部分)
- package tech.yfshadaow;
- import org.bukkit.generator.ChunkGenerator;
- import org.bukkit.Bukkit;
- import org.bukkit.World;
- import java.util.Random;
- import org.bukkit.util.noise.SimplexOctaveGenerator;
- import org.bukkit.Material;
- import org.bukkit.block.Biome;
- import java.util.List;
- import java.util.ArrayList;
- import java.lang.Math;
- import net.minecraft.server.v1_15_R1.WorldType;;
- public class EasternCraftGenerator extends ChunkGenerator{
- int currentHeight = 80;//Initialize currentHeight
- @Override
- public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) {
- EasternCraftChunkProvider provider = new EasternCraftChunkProvider(world.getSeed(),WorldType.NORMAL);
- SimplexOctaveGenerator generator = new SimplexOctaveGenerator(new Random(world.getSeed()), 8);//instantiate the terrain generator
- ChunkData chunk = createChunkData(world);
- generator.setScale(0.02D);//set generator parameter
- for (int X = 0; X < 16; X++)
- for (int Z = 0; Z < 16; Z++) {
- int baseHeight = 83;
- int extraHeight = 3;
- Material surfaceBlock = Material.GRASS_BLOCK;
- Material subSurfaceBLock = Material.DIRT;
- if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.DESERT)) {baseHeight = 83; extraHeight = 3; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
- else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.DESERT_HILLS)) {baseHeight = 100; extraHeight = 20; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
- else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.RIVER)) {baseHeight = 70; extraHeight = 1; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
- else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.OCEAN)) {baseHeight = 50; extraHeight = 3; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
- else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.MOUNTAINS)) {baseHeight = 128; extraHeight = 64; surfaceBlock = Material.GRASS_BLOCK; subSurfaceBLock = Material.DIRT;}
-
- currentHeight = (int) (generator.noise(chunkX*16+X, chunkZ*16+Z, 0.3D, 0.3D)* extraHeight + baseHeight);
-
- chunk.setBlock(X, currentHeight, Z, surfaceBlock);
- for (int c = 1; c < 9; c++) {
- chunk.setBlock(X, currentHeight-c, Z, subSurfaceBLock);
- }
- for (int i = currentHeight-9; i > 0; i--)
- chunk.setBlock(X, i, Z, Material.STONE);
- chunk.setBlock(X, 0, Z, Material.BEDROCK);
- if (currentHeight < 80) {
- for(int n = 80; n > currentHeight; n--) {
- chunk.setBlock(X, n, Z, Material.WATER);
- }
- }//以上代码放置相应方块和水
- }
- return chunk;
- }
-
- }
- package tech.yfshadaow;
- import net.minecraft.server.v1_15_R1.WorldChunkManager;
- import net.minecraft.server.v1_15_R1.GenLayers;
- import net.minecraft.server.v1_15_R1.GenLayer;
- import net.minecraft.server.v1_15_R1.Biomes;
- import net.minecraft.server.v1_15_R1.BiomeBase;
- import java.util.Set;
- import com.google.common.collect.ImmutableSet;
- import net.minecraft.server.v1_15_R1.GeneratorSettingsOverworld;
- import org.bukkit.craftbukkit.v1_15_R1.block.CraftBlock;
- import org.bukkit.block.Biome;
- public class EasternCraftChunkProvider extends WorldChunkManager {
- private final GenLayer layer;
-
- private static final Set<BiomeBase> e = (Set<BiomeBase>)ImmutableSet.of(Biomes.OCEAN, Biomes.PLAINS, Biomes.DESERT, Biomes.MOUNTAINS, Biomes.FOREST, Biomes.TAIGA, new BiomeBase[] {
- Biomes.SWAMP, Biomes.RIVER, Biomes.FROZEN_OCEAN, Biomes.FROZEN_RIVER, Biomes.SNOWY_TUNDRA, Biomes.SNOWY_MOUNTAINS, Biomes.MUSHROOM_FIELDS, Biomes.MUSHROOM_FIELD_SHORE, Biomes.BEACH, Biomes.DESERT_HILLS,
- Biomes.WOODED_HILLS, Biomes.TAIGA_HILLS, Biomes.MOUNTAIN_EDGE, Biomes.JUNGLE, Biomes.JUNGLE_HILLS, Biomes.JUNGLE_EDGE, Biomes.DEEP_OCEAN, Biomes.STONE_SHORE, Biomes.SNOWY_BEACH, Biomes.BIRCH_FOREST,
- Biomes.BIRCH_FOREST_HILLS, Biomes.DARK_FOREST, Biomes.SNOWY_TAIGA, Biomes.SNOWY_TAIGA_HILLS, Biomes.GIANT_TREE_TAIGA, Biomes.GIANT_TREE_TAIGA_HILLS, Biomes.WOODED_MOUNTAINS, Biomes.SAVANNA, Biomes.SAVANNA_PLATEAU, Biomes.BADLANDS,
- Biomes.WOODED_BADLANDS_PLATEAU, Biomes.BADLANDS_PLATEAU, Biomes.WARM_OCEAN, Biomes.LUKEWARM_OCEAN, Biomes.COLD_OCEAN, Biomes.DEEP_WARM_OCEAN, Biomes.DEEP_LUKEWARM_OCEAN, Biomes.DEEP_COLD_OCEAN, Biomes.DEEP_FROZEN_OCEAN, Biomes.SUNFLOWER_PLAINS,
- Biomes.DESERT_LAKES, Biomes.GRAVELLY_MOUNTAINS, Biomes.FLOWER_FOREST, Biomes.TAIGA_MOUNTAINS, Biomes.SWAMP_HILLS, Biomes.ICE_SPIKES, Biomes.MODIFIED_JUNGLE, Biomes.MODIFIED_JUNGLE_EDGE, Biomes.TALL_BIRCH_FOREST, Biomes.TALL_BIRCH_HILLS,
- Biomes.DARK_FOREST_HILLS, Biomes.SNOWY_TAIGA_MOUNTAINS, Biomes.GIANT_SPRUCE_TAIGA, Biomes.GIANT_SPRUCE_TAIGA_HILLS, Biomes.MODIFIED_GRAVELLY_MOUNTAINS, Biomes.SHATTERED_SAVANNA, Biomes.SHATTERED_SAVANNA_PLATEAU, Biomes.ERODED_BADLANDS, Biomes.MODIFIED_WOODED_BADLANDS_PLATEAU, Biomes.MODIFIED_BADLANDS_PLATEAU });
- //此处加入你想生成的群系
-
- public EasternCraftChunkProvider(long seed, net.minecraft.server.v1_15_R1.WorldType worldType) {
- super(e);
- this.layer = GenLayers.a(seed, worldType, new GeneratorSettingsOverworld());
- }
-
- public Biome getBukkitBiome(int var0, int var1) {
- BiomeBase base = this.layer.a(var0, var1);
- return CraftBlock.biomeBaseToBiome(base);
- }
-
- public BiomeBase getBiome(int var0, int var1, int var2) {
- return this.layer.a(var0, var2);
- }
- }
请问大佬是否愿意给点建议?感谢!
我刚刚在判断Biome的语句后添加了这段代码:
复制代码
强行将此位置的Biome设置成我用 getBukkitBiome()方法获取的Biome
结果很明显地得到了一个缩小版的地形:
明显的看到河流变得非常细,然后平原biome变得很小
所以我基本可以确定是坐标数字的问题。但是又是哪里出了问题呢...?
- biome.setBiome(X, Z, provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z));
强行将此位置的Biome设置成我用 getBukkitBiome()方法获取的Biome
结果很明显地得到了一个缩小版的地形:

明显的看到河流变得非常细,然后平原biome变得很小
所以我基本可以确定是坐标数字的问题。但是又是哪里出了问题呢...?