Posted July 21, 20205 yr The moment the game tries to load the biome that the surface builder is associated there is a crash. The issue only occurs when using my custom surface builder. Using the vanilla mountain surface builder, there is no issue. Registration seems to be checking out – the builder isn't returning null. Below is a crash log of the error.It seems to come down to setSeed, but there is no indication I need to specifically supply the seed in the surface builder. Most of the vanilla ones don't – the mountain surface builder amongst them. Spoiler [m[1;31m[22:56:44] [Server thread/ERROR] [minecraft/MinecraftServer]: Encountered an unexpected exception net.minecraft.crash.ReportedException: Exception generating new chunk at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:869) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:800) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) ~[?:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:646) [?:?] {re:classloading,pl:accesstransformer:B} at java.lang.Thread.run(Unknown Source) [?:1.8.0_221] {} Caused by: java.lang.NullPointerException at net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder.setSeed(ConfiguredSurfaceBuilder.java:22) ~[?:?] {re:classloading} at net.minecraft.world.biome.Biome.buildSurface(Biome.java:326) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.world.gen.NoiseChunkGenerator.generateSurface(NoiseChunkGenerator.java:199) ~[?:?] {re:classloading} at net.minecraft.world.chunk.ChunkStatus.lambda$static$6(ChunkStatus.java:61) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.world.chunk.ChunkStatus$ISelectiveWorker.doWork(ChunkStatus.java:242) ~[?:?] {re:classloading} at net.minecraft.world.chunk.ChunkStatus.func_223198_a(ChunkStatus.java:196) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.world.server.ChunkManager.lambda$null$17(ChunkManager.java:512) ~[?:?] {re:classloading} at com.mojang.datafixers.util.Either$Left.map(Either.java:38) ~[datafixerupper-2.0.24.jar:?] {} at net.minecraft.world.server.ChunkManager.lambda$func_223156_b$19(ChunkManager.java:510) ~[?:?] {re:classloading} at java.util.concurrent.CompletableFuture.uniCompose(Unknown Source) ~[?:1.8.0_221] {} at java.util.concurrent.CompletableFuture$UniCompose.tryFire(Unknown Source) ~[?:1.8.0_221] {} at java.util.concurrent.CompletableFuture$Completion.run(Unknown Source) ~[?:1.8.0_221] {} at net.minecraft.world.chunk.ChunkTaskPriorityQueueSorter.lambda$null$1(ChunkTaskPriorityQueueSorter.java:44) ~[?:?] {re:classloading} at net.minecraft.util.concurrent.DelegatedTaskExecutor.driveOne(DelegatedTaskExecutor.java:83) ~[?:?] {re:classloading} at net.minecraft.util.concurrent.DelegatedTaskExecutor.driveWhile(DelegatedTaskExecutor.java:123) ~[?:?] {re:classloading} at net.minecraft.util.concurrent.DelegatedTaskExecutor.run(DelegatedTaskExecutor.java:91) ~[?:?] {re:classloading} at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(Unknown Source) ~[?:1.8.0_221] {} at java.util.concurrent.ForkJoinTask.doExec(Unknown Source) ~[?:1.8.0_221] {} at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(Unknown Source) ~[?:1.8.0_221] {} at java.util.concurrent.ForkJoinPool.runWorker(Unknown Source) ~[?:1.8.0_221] {} at java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source) ~[?:1.8.0_221] {} [m[1;31m[22:56:44] [Server thread/ERROR] [minecraft/MinecraftServer]: This crash report has been saved to: C:\Users\salvestrom\Desktop\MeincraftJungle 1.14.4\run\.\crash-reports\crash-2019-11-28_22.56.44-server.txt [m[32m[22:56:44] [Server thread/INFO] [minecraft/MinecraftServer]: Stopping server [m[32m[22:56:44] [Server thread/INFO] [minecraft/MinecraftServer]: Saving players [m[32m[22:56:44] [Client thread/INFO] [STDOUT/]: [net.minecraft.util.registry.Bootstrap:printToSYSOUT:106]: ---- Minecraft Crash Report ---- // I feel sad now Time: 28/11/19 22:56 Description: Exception generating new chunk java.lang.NullPointerException: Exception generating new chunk at net.minecraft.world.gen.surfacebuilders.ConfiguredSurfaceBuilder.setSeed(ConfiguredSurfaceBuilder.java:22) ~[?:?] {re:classloading} at net.minecraft.world.biome.Biome.buildSurface(Biome.java:326) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.world.gen.NoiseChunkGenerator.generateSurface(NoiseChunkGenerator.java:199) ~[?:?] {re:classloading} at net.minecraft.world.chunk.ChunkStatus.lambda$static$6(ChunkStatus.java:61) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.world.chunk.ChunkStatus$ISelectiveWorker.doWork(ChunkStatus.java:242) ~[?:?] {re:classloading} at net.minecraft.world.chunk.ChunkStatus.func_223198_a(ChunkStatus.java:196) ~[?:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.world.server.ChunkManager.lambda$null$17(ChunkManager.java:512) ~[?:?] {re:classloading} at com.mojang.datafixers.util.Either$Left.map(Either.java:38) ~[datafixerupper-2.0.24.jar:?] {} at net.minecraft.world.server.ChunkManager.lambda$func_223156_b$19(ChunkManager.java:510) ~[?:?] {re:classloading} at java.util.concurrent.CompletableFuture.uniCompose(Unknown Source) ~[?:1.8.0_221] {} at java.util.concurrent.CompletableFuture$UniCompose.tryFire(Unknown Source) ~[?:1.8.0_221] {} at java.util.concurrent.CompletableFuture$Completion.run(Unknown Source) ~[?:1.8.0_221] {} at net.minecraft.world.chunk.ChunkTaskPriorityQueueSorter.lambda$null$1(ChunkTaskPriorityQueueSorter.java:44) ~[?:?] {re:classloading} at net.minecraft.util.concurrent.DelegatedTaskExecutor.driveOne(DelegatedTaskExecutor.java:83) ~[?:?] {re:classloading} at net.minecraft.util.concurrent.DelegatedTaskExecutor.driveWhile(DelegatedTaskExecutor.java:123) ~[?:?] {re:classloading} at net.minecraft.util.concurrent.DelegatedTaskExecutor.run(DelegatedTaskExecutor.java:91) ~[?:?] {re:classloading} at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(Unknown Source) ~[?:1.8.0_221] {} at java.util.concurrent.ForkJoinTask.doExec(Unknown Source) ~[?:1.8.0_221] {} at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(Unknown Source) ~[?:1.8.0_221] {} at java.util.concurrent.ForkJoinPool.runWorker(Unknown Source) ~[?:1.8.0_221] {} at java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source) ~[?:1.8.0_221] {} This is the registration class for the surface builder. @EventBusSubscriber(modid = References.MODID, bus = EventBusSubscriber.Bus.MOD) @ObjectHolder(References.MODID) public class RegisterSurfaceBuilders { @ObjectHolder(References.MODID + ":jungle_mountain_builder") public static SurfaceBuilder<SurfaceBuilderConfig> JUNGLE_MOUNTAIN; @SubscribeEvent public static void registerSurfaceBuilders(final RegistryEvent.Register<SurfaceBuilder<?>> event) { JUNGLE_MOUNTAIN = new JungleMountainSurfaceBuilder(SurfaceBuilderConfig::deserialize); registerBuilder(event.getRegistry(), JUNGLE_MOUNTAIN, "jungle_mountain_builder"); } private static <T extends SurfaceBuilder<?>> T registerBuilder(final IForgeRegistry<SurfaceBuilder<?>> registry, final T builder, final String builderName) { if(registry==null) { throw new NullPointerException("Something's gone wrong!"); } else { builder.setRegistryName(References.MODID, builderName); registry.register(builder); } return builder; } } And this is the surface builder class. public class JungleMountainSurfaceBuilder extends SurfaceBuilder<SurfaceBuilderConfig> { public JungleMountainSurfaceBuilder(Function<Dynamic<?>, ? extends SurfaceBuilderConfig> p_i51310_1_) { super(p_i51310_1_); } public void buildSurface(Random random, IChunk chunkIn, Biome biomeIn, int x, int z, int startHeight, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, SurfaceBuilderConfig config) { if (noise > 3.0D) { SurfaceBuilder.DEFAULT.buildSurface(random, chunkIn, biomeIn, x, z, startHeight, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilder.STONE_STONE_GRAVEL_CONFIG); } else { SurfaceBuilder.DEFAULT.buildSurface(random, chunkIn, biomeIn, x, z, startHeight, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilder.GRASS_DIRT_GRAVEL_CONFIG); } } } Edited July 23, 20205 yr by salvestrom
July 23, 20205 yr Author I now have this setup as below. This allowed 2 to 3 dozen chunks to spawn. I was able to get rest to work smoothly by removing my custom mobs from the spawn list in the biome class. I don't think their placement code is in place properly. I assumed this was the problem along. This is the registration class for the surface builder. @EventBusSubscriber(modid = References.MODID, bus = EventBusSubscriber.Bus.MOD) @ObjectHolder(References.MODID) public class RegisterSurfaceBuilders { @ObjectHolder(References.MODID + ":jungle_mountain_builder") public static SurfaceBuilder<SurfaceBuilderConfig> JUNGLE_MOUNTAIN=new JungleMountainSurfaceBuilder(); @SubscribeEvent public static void registerSurfaceBuilders(final RegistryEvent.Register<SurfaceBuilder<?>> event) { registerBuilder(event.getRegistry(), JUNGLE_MOUNTAIN, "jungle_mountain_builder"); } private static <T extends SurfaceBuilder<?>> T registerBuilder(final IForgeRegistry<SurfaceBuilder<?>> registry, final T builder, final String builderName) { if(registry==null) { throw new NullPointerException("Something's gone wrong!"); } else { builder.setRegistryName(References.MODID, builderName); registry.register(builder); } return builder; } } And this is the surface builder class. public class JungleMountainSurfaceBuilder extends SurfaceBuilder<SurfaceBuilderConfig> { public JungleMountainSurfaceBuilder() { super(SurfaceBuilderConfig::deserialize); } public void buildSurface(Random random, IChunk chunkIn, Biome biomeIn, int x, int z, int startHeight, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, long seed, SurfaceBuilderConfig config) { if (noise > 3.0D) { SurfaceBuilder.DEFAULT.buildSurface(random, chunkIn, biomeIn, x, z, startHeight, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilder.STONE_STONE_GRAVEL_CONFIG); } else { SurfaceBuilder.DEFAULT.buildSurface(random, chunkIn, biomeIn, x, z, startHeight, noise, defaultBlock, defaultFluid, seaLevel, seed, SurfaceBuilder.GRASS_DIRT_GRAVEL_CONFIG); } } }
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.