renzd2001
大佬们晚上好,我在尝试为 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的信息?

万分感谢!!!!!(当然如果大佬有相关教程的传送门,我也十分感谢,我只在谷歌上搜索了相关教程,但是没有找到想要的东西。)

以下是我生成器的代码部分:
  1. package tech.yfshadaow;

  2. import org.bukkit.generator.ChunkGenerator;
  3. import org.bukkit.Bukkit;
  4. import org.bukkit.World;
  5. import java.util.Random;
  6. import org.bukkit.util.noise.SimplexOctaveGenerator;
  7. import org.bukkit.Material;
  8. import org.bukkit.block.Biome;
  9. import java.util.List;
  10. import java.util.ArrayList;
  11. import java.lang.Math;

  12. public class EasternCraftGenerator extends ChunkGenerator{
  13.         int currentHeight = 80;//初始化高度
  14.         @Override
  15.     public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) {
  16.             SimplexOctaveGenerator generator = new SimplexOctaveGenerator(new Random(world.getSeed()), 8);//创建地形起伏生成器
  17.         ChunkData chunk = createChunkData(world);
  18.         generator.setScale(0.02D);//生成器设定参数

  19.         for (int X = 0; X < 16; X++)
  20.             for (int Z = 0; Z < 16; Z++) {//遍历区块的每一个X、Z坐标
  21.                     int baseHeight = 80;//初始化最低高度
  22.                     int extraHeight = 5;//初始化额外高度最大值
  23.                         Material surfaceBlock = Material.GRASS_BLOCK;//设置顶部方块
  24.                         Material subSurfaceBLock = Material.DIRT;//设置顶部下方块
  25.                     if (biome.getBiome(X,Z).equals(Biome.DESERT)) {baseHeight = 80; extraHeight = 5; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
  26.                     else if (biome.getBiome(X,Z).equals(Biome.DESERT_HILLS)) {baseHeight = 80; extraHeight = 40; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
  27.                     else if (biome.getBiome(X,Z).equals(Biome.RIVER)) {baseHeight = 70; extraHeight = 2; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
  28.                     else if (biome.getBiome(X,Z).equals(Biome.OCEAN)) {baseHeight = 50; extraHeight = 6; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
  29.                     else if (biome.getBiome(X,Z).equals(Biome.MOUNTAINS)) {baseHeight = 64; extraHeight = 128; surfaceBlock = Material.GRASS_BLOCK; subSurfaceBLock = Material.DIRT;}//设置biome参数的暂时性代码,以后会改
  30.                 currentHeight = (int) (generator.noise(chunkX*16+X, chunkZ*16+Z, 0.3D, 0.3D)*((extraHeight + 1)/2)+baseHeight);//高度=生成的(0~1)随机数 * 额外高度最大值 + 最低高度
  31.                 List<Biome> biomesInfo = new ArrayList<Biome>();//初始化平滑区块要用的区块列表
  32.                     List<Double> distancesInfo = new ArrayList<Double>();//初始化平滑区块要用的距离列表
  33.                     for (int p = 0; p < 10; p++) {
  34.                             for (int q = -p; q <= p; q++) {//以上两行起到的作用是,以(|x坐标差值|+|z坐标差值|)从小到大为顺序,遍历当前方块周围的 正方形范围的所有方块
  35.                                     if (!(biomesInfo.contains(world.getBiome(chunkX*16+X + q, chunkZ*16+Z + (p - Math.abs(q)))))) {
  36.                                             biomesInfo.add(world.getBiome(chunkX*16+X + q, chunkZ*16+Z + (p - Math.abs(q))));
  37.                                             distancesInfo.add(Math.sqrt((double)(q ^ 2 + (p - Math.abs(q)) ^ 2)));//计算直线距离
  38.                                     }
  39.                                     if (!(biomesInfo.contains(world.getBiome(chunkX*16+X + q, chunkZ*16+Z - (p - Math.abs(q)))))) {
  40.                                             biomesInfo.add(world.getBiome(chunkX*16+X + q, chunkZ*16+Z - (p - Math.abs(q))));
  41.                                             distancesInfo.add(Math.sqrt((double)(q ^ 2 + (p - Math.abs(q)) ^ 2)));//计算直线距离
  42.                                     }
  43.                             }
  44.                     }
  45.                 currentHeight = getCurrentHeight(currentHeight, biomesInfo, distancesInfo);
  46.                 //这一整段代码,会把这个方块附近一定范围内存在的biome不重复地记录下来,并且记录下该biome距离当前方块的最短距离(这个距离可能不是最短,但是离最短差不多,没有很大影响)
  47.                
  48.                
  49.                
  50.                
  51.                
  52.                 chunk.setBlock(X, currentHeight, Z, surfaceBlock);
  53.                 for (int c = 1; c < 9; c++) {
  54.                     chunk.setBlock(X, currentHeight-c, Z, subSurfaceBLock);
  55.                 }
  56.                 for (int i = currentHeight-9; i > 0; i--)
  57.                     chunk.setBlock(X, i, Z, Material.STONE);
  58.                 chunk.setBlock(X, 0, Z, Material.BEDROCK);
  59.                 if (currentHeight < 80) {
  60.                         for(int n = 80; n > currentHeight; n--) {
  61.                                 chunk.setBlock(X, n, Z, Material.WATER);
  62.                         }
  63.                 }//以上代码放置相应方块和水
  64.             }
  65.         return chunk;
  66.     }
  67.         public int getCurrentHeight(int currentHeight, List<Biome> biomesInfo, List<Double> distancesInfo) {
  68.                 double weightSum = 0;
  69.                 double numerator = 0;
  70.                 for (int i = 0; i < biomesInfo.size(); i++) {
  71.                         weightSum += (10 - distancesInfo.get(i));
  72.                         numerator += (10 - distancesInfo.get(i)) * ((getBiomeBaseHeight(biomesInfo.get(i))) - (currentHeight));
  73.                 }
  74.                 return (int)(numerator / weightSum + currentHeight);
  75.         }
  76.         public int getBiomeBaseHeight(Biome biome) {//此方法用来获取biome的最低高度
  77.                 if (biome.equals(Biome.DESERT)) {return 80;}
  78.                 else if (biome.equals(Biome.DESERT_HILLS)) {return 80;}
  79.                 else if (biome.equals(Biome.RIVER)) {return 70;}
  80.                 else if (biome.equals(Biome.OCEAN)) {return 50;}
  81.                 else if (biome.equals(Biome.MOUNTAINS)) {return 64;}
  82.                 else {return 80;}
  83.         }
  84.        
  85. }
复制代码




天辉胡萝卜
最好的方法是使用GenLayer,让MC自动分配生物群系
以1.15.2为例(不同版本略有不同)

  1. public class CustomChunkProvider extends WorldChunkManager {
  2.   private final GenLayer layer;
  3.   
  4.   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[] {
  5.         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,
  6.         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,
  7.         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,
  8.         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,
  9.         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,
  10.         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 });
  11.         //此处加入你想生成的群系
  12.   
  13.   public CustomChunkProvider(long seed, net.minecraft.server.v1_15_R1.WorldType worldType) {
  14.     super(e);
  15.     this.layer = GenLayers.a(seed, worldType, new GeneratorSettingsOverworld());
  16.   }
  17.   
  18.   public Biome getBiome(int var0, int var1, int var2) {
  19.     BiomeBase base = this.layer.a(var0, var2);
  20.     return CraftBlock.biomeBaseToBiome(base);
  21.   }
  22. }
复制代码



renzd2001
疾风暗影 发表于 2020-5-31 01:38
最好的方法是使用GenLayer,让MC自动分配生物群系
以1.15.2为例(不同版本略有不同)


十分感谢!!!

renzd2001
疾风暗影 发表于 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自己的层级噪声生成优化的群系分布

你可以地形生成用自己的代码,群系生成用这些

renzd2001
疾风暗影 发表于 2020-5-31 10:29
这是调用nms的方法,用mc自己的层级噪声生成优化的群系分布

你可以地形生成用自己的代码,群系生成用这 ...

大佬你好,我用了你给的代码,已经可以正常生成世界了,但是在判断生物群系时出了点小问题:

我原本判断生物群系使用的是spigot自带的 BiomeGrid.getBiome()方法,因为这个方法限于当前区块,所以X和Z坐标参数都是 0~15

现在我改用你给我的使用实例化的WorldChunkManager的方法,我认为这个方法应该是基于整个地图,所以我将原来的这部分判断代码
  1. if (biome.getBiome(X,Z).equals(Biome.DESERT)) {baseHeight = 80; extraHeight = 5; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
  2.                     else if (biome.getBiome(X,Z).equals(Biome.DESERT_HILLS)) {baseHeight = 80; extraHeight = 40; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
  3.                     else if (biome.getBiome(X,Z).equals(Biome.RIVER)) {baseHeight = 70; extraHeight = 2; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
  4.                     else if (biome.getBiome(X,Z).equals(Biome.OCEAN)) {baseHeight = 50; extraHeight = 6; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
  5.                     else if (biome.getBiome(X,Z).equals(Biome.MOUNTAINS)) {baseHeight = 64; extraHeight = 128; surfaceBlock = Material.GRASS_BLOCK; subSurfaceBLock = Material.DIRT;}
复制代码
改成了现在这样(getBukkitBiome()是我自己重写的方法 完整代码在后面)
  1. if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.DESERT)) {baseHeight = 83; extraHeight = 3; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
  2.                     else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.DESERT_HILLS)) {baseHeight = 100; extraHeight = 20; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
  3.                     else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.RIVER)) {baseHeight = 70; extraHeight = 1; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
  4.                     else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.OCEAN)) {baseHeight = 50; extraHeight = 3; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
  5.                     else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.MOUNTAINS)) {baseHeight = 128; extraHeight = 64; surfaceBlock = Material.GRASS_BLOCK; subSurfaceBLock = Material.DIRT;}
  6.                        
复制代码
但是出现了意料之外的结果:生物群系的高度和生物群系不对应了,我在XZ判断为河流的地方,发现了沙漠的地形特征。
请问我该怎么解决这个问题?
我认为我可能犯的错误:
1、我在转换区块内坐标和世界内坐标时出错(但我记得确实应该是chunkX*16+X, chunkZ*16+Z)
2、mc原版生成的Biome分布和spigot根本就不一样(这个不应该发生啊,spigot应该用的就是原版的生成器)(然而这个可以通过使用spigot自带的setBiome来间接解决)

以下为生成器部分代码:(我暂时删掉了平整地形的部分)
  1. package tech.yfshadaow;

  2. import org.bukkit.generator.ChunkGenerator;
  3. import org.bukkit.Bukkit;
  4. import org.bukkit.World;
  5. import java.util.Random;
  6. import org.bukkit.util.noise.SimplexOctaveGenerator;
  7. import org.bukkit.Material;
  8. import org.bukkit.block.Biome;
  9. import java.util.List;
  10. import java.util.ArrayList;
  11. import java.lang.Math;
  12. import net.minecraft.server.v1_15_R1.WorldType;;

  13. public class EasternCraftGenerator extends ChunkGenerator{
  14.         int currentHeight = 80;//Initialize currentHeight
  15.         @Override
  16.     public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) {
  17.                 EasternCraftChunkProvider provider = new EasternCraftChunkProvider(world.getSeed(),WorldType.NORMAL);
  18.             SimplexOctaveGenerator generator = new SimplexOctaveGenerator(new Random(world.getSeed()), 8);//instantiate the terrain generator
  19.         ChunkData chunk = createChunkData(world);
  20.         generator.setScale(0.02D);//set generator parameter

  21.         for (int X = 0; X < 16; X++)
  22.             for (int Z = 0; Z < 16; Z++) {
  23.                     int baseHeight = 83;
  24.                     int extraHeight = 3;
  25.                         Material surfaceBlock = Material.GRASS_BLOCK;
  26.                         Material subSurfaceBLock = Material.DIRT;
  27.                         if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.DESERT)) {baseHeight = 83; extraHeight = 3; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
  28.                     else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.DESERT_HILLS)) {baseHeight = 100; extraHeight = 20; surfaceBlock = Material.SAND; subSurfaceBLock = Material.SAND;}
  29.                     else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.RIVER)) {baseHeight = 70; extraHeight = 1; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
  30.                     else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.OCEAN)) {baseHeight = 50; extraHeight = 3; surfaceBlock = Material.DIRT; subSurfaceBLock = Material.DIRT;}
  31.                     else if (provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z).equals(Biome.MOUNTAINS)) {baseHeight = 128; extraHeight = 64; surfaceBlock = Material.GRASS_BLOCK; subSurfaceBLock = Material.DIRT;}
  32.                        
  33.                         currentHeight = (int) (generator.noise(chunkX*16+X, chunkZ*16+Z, 0.3D, 0.3D)* extraHeight + baseHeight);
  34.                        
  35.                 chunk.setBlock(X, currentHeight, Z, surfaceBlock);
  36.                 for (int c = 1; c < 9; c++) {
  37.                     chunk.setBlock(X, currentHeight-c, Z, subSurfaceBLock);
  38.                 }
  39.                 for (int i = currentHeight-9; i > 0; i--)
  40.                     chunk.setBlock(X, i, Z, Material.STONE);
  41.                 chunk.setBlock(X, 0, Z, Material.BEDROCK);
  42.                 if (currentHeight < 80) {
  43.                         for(int n = 80; n > currentHeight; n--) {
  44.                                 chunk.setBlock(X, n, Z, Material.WATER);
  45.                         }
  46.                 }//以上代码放置相应方块和水
  47.             }
  48.         return chunk;
  49.     }
  50.        
  51. }
复制代码
以下为继承了WorldChunkManager的代码部分:
  1. package tech.yfshadaow;

  2. import net.minecraft.server.v1_15_R1.WorldChunkManager;
  3. import net.minecraft.server.v1_15_R1.GenLayers;
  4. import net.minecraft.server.v1_15_R1.GenLayer;
  5. import net.minecraft.server.v1_15_R1.Biomes;
  6. import net.minecraft.server.v1_15_R1.BiomeBase;
  7. import java.util.Set;
  8. import com.google.common.collect.ImmutableSet;
  9. import net.minecraft.server.v1_15_R1.GeneratorSettingsOverworld;
  10. import org.bukkit.craftbukkit.v1_15_R1.block.CraftBlock;
  11. import org.bukkit.block.Biome;

  12. public class EasternCraftChunkProvider extends WorldChunkManager {
  13.           private final GenLayer layer;
  14.           
  15.           private static final Set<BiomeBase> e = (Set<BiomeBase>)ImmutableSet.of(Biomes.OCEAN, Biomes.PLAINS, Biomes.DESERT, Biomes.MOUNTAINS, Biomes.FOREST, Biomes.TAIGA, new BiomeBase[] {
  16.                 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,
  17.                 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,
  18.                 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,
  19.                 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,
  20.                 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,
  21.                 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 });
  22.                 //此处加入你想生成的群系
  23.           
  24.           public EasternCraftChunkProvider(long seed, net.minecraft.server.v1_15_R1.WorldType worldType) {
  25.             super(e);
  26.             this.layer = GenLayers.a(seed, worldType, new GeneratorSettingsOverworld());
  27.           }
  28.           
  29.           public Biome getBukkitBiome(int var0, int var1) {
  30.             BiomeBase base = this.layer.a(var0, var1);
  31.             return CraftBlock.biomeBaseToBiome(base);
  32.           }
  33.           
  34.           public BiomeBase getBiome(int var0, int var1, int var2) {
  35.                     return this.layer.a(var0, var2);
  36.           }
  37.         }
复制代码


请问大佬是否愿意给点建议?感谢!



renzd2001
我刚刚在判断Biome的语句后添加了这段代码:
  1. biome.setBiome(X, Z, provider.getBukkitBiome(chunkX*16+X, chunkZ*16+Z));
复制代码

强行将此位置的Biome设置成我用 getBukkitBiome()方法获取的Biome
结果很明显地得到了一个缩小版的地形:
明显的看到河流变得非常细,然后平原biome变得很小
所以我基本可以确定是坐标数字的问题。但是又是哪里出了问题呢...?

第一页 上一页 下一页 最后一页