Skip to content

BiomeProvider usage of vanillaBiomeProvider function causes nullpointer from null NMS value #9394

@casperwtf

Description

@casperwtf

Expected behavior

The expected behavior is that serverCache is not null.

Observed/Actual behavior

net.minecraft.server.level.ChunkProviderServer.g() cannot be called because serverCache is null

Steps/models to reproduce

Code:

package wtf.casper.nobiomegenerator;

import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public final class NoBiomeGeneratorPlugin extends JavaPlugin {

    @Override
    public @NotNull ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, @Nullable String id) {
        return new NoBiomeGenerator();
    }
}
package wtf.casper.nobiomegenerator;

import org.bukkit.generator.BiomeProvider;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.generator.WorldInfo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class NoBiomeGenerator extends ChunkGenerator {

    @Override
    public @Nullable BiomeProvider getDefaultBiomeProvider(@NotNull WorldInfo worldInfo) {
        return new NoBiomeProvider();
    }
}
package wtf.casper.nobiomegenerator;

import org.bukkit.block.Biome;
import org.bukkit.generator.BiomeProvider;
import org.bukkit.generator.WorldInfo;
import org.jetbrains.annotations.NotNull;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class NoBiomeProvider extends BiomeProvider {

    private final Set<Biome> disabledBiomes = new HashSet<>();

    public NoBiomeProvider() {
        disabledBiomes.add(Biome.OCEAN);
    }


    @Override
    public @NotNull Biome getBiome(@NotNull WorldInfo worldInfo, int x, int y, int z) {
        if (disabledBiomes.contains(this.worldInfo.vanillaBiomeProvider().getBiome(worldInfo, x, y, z))) {
            return Biome.PLAINS;
        }

        return worldInfo.vanillaBiomeProvider().getBiome(worldInfo, x, y, z);
    }

    @Override
    public @NotNull List<Biome> getBiomes(@NotNull WorldInfo worldInfo) {
        return worldInfo.vanillaBiomeProvider().getBiomes(worldInfo);
    }
}

To create in new project...

  1. Create a class that extends ChunkGenerator and a class that extends a BiomeProvider. Override the getDefaultWorldGenerator function in your main class to load a new instance of that class. In your chunk generator class. In your chunk generator class, override your getDefaultBiomeProvider function to give your BiomeProvider instance.
  2. In your BiomeProvider class, use the worldInfo variable to call vanillaBiomeProvider.

Plugin and Datapack List

Plugins: NoBiomeGenerator

Paper version

This server is running Paper version git-Paper-48 (MC: 1.20.1) (Implementing API version 1.20.1-R0.1-SNAPSHOT) (Git: b34d4ec)

Also tested in 1.19.3's final build and it was broken.
Tested with 1.18.2's final build and it worked.

Other

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    status: acceptedDisputed bug is accepted as valid or Feature accepted as desired to be added.type: bugSomething doesn't work as it was intended to.

    Type

    No fields configured for Bug.

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions