Solved Generate Empty World

Discussion in 'Plugin Development' started by Chr0mosom3, Apr 14, 2020.

Thread Status:
Not open for further replies.
  1. Offline

    Chr0mosom3

    Hello there, I am trying to create a empty world, but how do i do it in version above 1.13

    EDIT: Removing every block in a 1000 block radius isn't effective enough
     
  2. Offline

    timtower Administrator Administrator Moderator

  3. Offline

    Chr0mosom3

    Code:
    public class CustomChunkGenerator extends ChunkGenerator {
        int currentHeight = 50;
    
        @Override
        public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) {
            ChunkData chunk = createChunkData(world);
            return chunk;
        }
    }
    Would this code work?
     
  4. Offline

    timtower Administrator Administrator Moderator

    @MrDaniel And where would createChunkData come from?
     
  5. Offline

    Chr0mosom3

    Tested it, doesn't work, the default worlds is what I get. Would it work if I just returned an empty chunk, or like return null for example?
     
  6. Offline

    timtower Administrator Administrator Moderator

    Null will throw an error.
    Empty chunk is what you want.
     
  7. Offline

    Chr0mosom3

    I'm having a problem
    Code:
    @Override
        public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
            System.out.println("boi");
            return new VoidGenerator();
        }
    This line of code in my main class is not being called (as far as I know, it's supposed to be called)

    My VoidGenerator Class:

    Code:
    package ladeira.world;
    
    import java.util.Random;
    
    import org.bukkit.World;
    import org.bukkit.generator.ChunkGenerator;
    
    
    public class VoidGenerator extends ChunkGenerator{
       
        public byte[][] generateBlockSections(World world, Random random, int chunkX, int chunkZ, BiomeGrid biomeGrid){
            byte[][] result = new byte[world.getMaxHeight() / 16][];
            System.out.println("i exist");
            return result;
        }
    }
    (version is 1.15.2)
     
  8. Offline

    timtower Administrator Administrator Moderator

    @MrDaniel How are you making the world then?
     
  9. Offline

    Chr0mosom3

    As far as I see, I am not and I do not know what the problem is, my plugin.yml looks like this:

    Code:
    name: ServerArchitect
    version: 1.0
    author: DespactioMaster
    main: ladeira.general.ServerHandler
    api-version: 1.13
    load: STARTUP
    
    commands:
       reload:
       msg:
    
    worlds:
      YourWorldNameHere:
        generator: ServerArchitect
    Edit: Nvm, found it, I am gonna change the yourworldnamehere and gonna see what happens
     
  10. Offline

    timtower Administrator Administrator Moderator

    @MrDaniel I don't think that you can put the worlds in there though.
     
  11. Offline

    Chr0mosom3

    @timtower what do you mean?

    I also tested it with the world and it didn't work
     
  12. Offline

    timtower Administrator Administrator Moderator

    You can't do that with the plugin.ml
    That needs to happen in the bukkit.yml I believe.
     
  13. Offline

    Chr0mosom3

    How do I do it there? And are you talking about bukkit.yml in the server folder or like a second plugin.yml?
     
  14. Offline

    timtower Administrator Administrator Moderator

  15. Offline

    Chr0mosom3

    @timtower fixed it, thx

    For anyone that wants my code
    Code:
    package ladeira.world;
    
    import java.util.Collections;
    import java.util.List;
    import java.util.Random;
    
    import org.bukkit.Location;
    import org.bukkit.World;
    import org.bukkit.block.Biome;
    import org.bukkit.generator.BlockPopulator;
    import org.bukkit.generator.ChunkGenerator;
    
    
    public class VoidGenerator extends ChunkGenerator{
       
        @Override
        public List<BlockPopulator> getDefaultPopulators(World world) {
            return Collections.<BlockPopulator>emptyList();
        }
       
        @SuppressWarnings("deprecation")
        @Override
        public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) {
            ChunkData chunkData = super.createChunkData(world);
           
            // For everyblock in the chunk set the biome to plains
            for(int x = 0; x < 16; x++) {
                for(int z = 0; z < 16; z++) {
                    biome.setBiome(x, z, Biome.PLAINS);
                }
            }
           
            return chunkData;
        }
       
        @Override
        public boolean canSpawn(World world, int x, int z) {
            return true;
        }
       
        @Override
        public Location getFixedSpawnLocation(World world, Random random) {
            return new Location(world, 0, 128, 0);
        }
    }
    One more thing, why wouldn't this code work?

    Code:
    package ladeira.world;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.World;
    import org.bukkit.WorldCreator;
    
    public class WorldHandler {
        public static Location hubSpawn;
     
        public WorldHandler() {
            createWorlds();
            hubSpawn = new Location(Bukkit.getWorld("hub"), 0, 128, 0);
        }
     
        private void createWorlds() {
            if (!(Bukkit.getWorld("hub") != null)) {
                WorldCreator creator = new WorldCreator("hub");
                creator.generator(new VoidGenerator());
                World world = creator.createWorld();
            }
        }
    }
    It thorws an illegal state exeption

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Apr 15, 2020
    timtower likes this.
  16. Offline

    timtower Administrator Administrator Moderator

  17. Offline

    Chr0mosom3

    Code:
    java.lang.IllegalStateException: Cannot create additional worlds on STARTUP
            at com.google.common.base.Preconditions.checkState(Preconditions.java:444) ~[spigot-1.15.2.jar:git-Spigot-ae72bf4-183139d]
            at org.bukkit.craftbukkit.v1_15_R1.CraftServer.createWorld(CraftServer.java:926) ~[spigot-1.15.2.jar:git-Spigot-ae72bf4-183139d]
            at org.bukkit.Bukkit.createWorld(Bukkit.java:502) ~[spigot-1.15.2.jar:git-Spigot-ae72bf4-183139d]
            at org.bukkit.WorldCreator.createWorld(WorldCreator.java:320) ~[spigot-1.15.2.jar:git-Spigot-ae72bf4-183139d]
            at ladeira.world.WorldHandler.createWorlds(WorldHandler.java:20) ~[?:?]
            at ladeira.world.WorldHandler.<init>(WorldHandler.java:12) ~[?:?]
            at ladeira.general.ServerHandler.onEnable(ServerHandler.java:37) ~[?:?]
            at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[spigot-1.15.2.jar:git-Spigot-ae72bf4-183139d]
            at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:351) [spigot-1.15.2.jar:git-Spigot-ae72bf4-183139d]
            at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:480) [spigot-1.15.2.jar:git-Spigot-ae72bf4-183139d]
            at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugin(CraftServer.java:464) [spigot-1.15.2.jar:git-Spigot-ae72bf4-183139d]
            at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugins(CraftServer.java:378) [spigot-1.15.2.jar:git-Spigot-ae72bf4-183139d]
            at net.minecraft.server.v1_15_R1.DedicatedServer.init(DedicatedServer.java:211) [spigot-1.15.2.jar:git-Spigot-ae72bf4-183139d]
            at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:784) [spigot-1.15.2.jar:git-Spigot-ae72bf4-183139d]
            at java.lang.Thread.run(Unknown Source) [?:1.8.0_241]
     
  18. Offline

    timtower Administrator Administrator Moderator

    @MrDaniel Did you read the message?
    You are probably doing things in your constructor, as in having an instance to that class being initialized that is defined outside of any methods.
     
  19. Offline

    Chr0mosom3

    @timtower, I don't really understand what you are saying, but in my VoidGenerator class I don't have a constructor. In the constructor of worldhandler the only thing that I am refrencing is the method that creates the world.
     
  20. Offline

    timtower Administrator Administrator Moderator

    @MrDaniel Please post your classes.
    You should create the world in the onEnable, or after the server is started.
    But the best way is by using the bukkit.yml
     
  21. Offline

    Chr0mosom3

    Main class:
    Code:
    package ladeira.general;
    
    import org.bukkit.Bukkit;
    import org.bukkit.event.Listener;
    import org.bukkit.generator.ChunkGenerator;
    import org.bukkit.plugin.Plugin;
    import org.bukkit.plugin.java.JavaPlugin;
    
    import ladeira.attributes.AttributesHandler;
    import ladeira.commands.msg;
    import ladeira.events.ChatEvent;
    import ladeira.events.CommandProcessEvent;
    import ladeira.events.InventorySelectEvent;
    import ladeira.events.JoinLeaveEvent;
    import ladeira.events.PlayerDieEvent;
    import ladeira.events.PlayerDropEvent;
    import ladeira.events.PlayerUseEvent;
    import ladeira.vanish.VanishHandler;
    import ladeira.world.VoidGenerator;
    import ladeira.world.WorldHandler;
    
    public class ServerHandler extends JavaPlugin {
       
        private static Plugin plugin;
       
        @Override
        public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
            System.out.println("boi");
            return new VoidGenerator();
        }
       
        @Override
        public void onEnable() {
            plugin = this; // Should be before everyone else
           
            new ConfigHandler(this.getDataFolder().getAbsolutePath()); // Load configs
            new WorldHandler(); // Generate/Load worlds
           
            // Set variables for classes
            AttributesHandler.loadAttributes();
            VanishHandler.loadVanishMessages();
           
            // Events, boring but needed
            registerEvents(this, new JoinLeaveEvent(), new ChatEvent(), new PlayerDieEvent(), new CommandProcessEvent(), new PlayerUseEvent(), new InventorySelectEvent(), new PlayerDropEvent());
           
            // Commands
            getCommand("msg").setExecutor(new msg());
           
            @SuppressWarnings("unused")
            Metrics metrics = new Metrics(this); // bStats
        }
       
        public void onDisable() {
            plugin = null; // Should be after everything else
        }
       
        public static void registerEvents(Plugin plugin, Listener... listeners) {
            for (Listener listener : listeners) {
                Bukkit.getServer().getPluginManager().registerEvents(listener, plugin);
            }
        }
       
        public static Plugin getPlugin() { return plugin; }
    }
    VoidGenerator:
    Code:
    package ladeira.world;
    
    import java.util.Collections;
    import java.util.List;
    import java.util.Random;
    
    import org.bukkit.Location;
    import org.bukkit.World;
    import org.bukkit.block.Biome;
    import org.bukkit.generator.BlockPopulator;
    import org.bukkit.generator.ChunkGenerator;
    
    
    public class VoidGenerator extends ChunkGenerator{
       
        @Override
        public List<BlockPopulator> getDefaultPopulators(World world) {
            return Collections.<BlockPopulator>emptyList();
        }
       
        @SuppressWarnings("deprecation")
        @Override
        public ChunkData generateChunkData(World world, Random random, int chunkX, int chunkZ, BiomeGrid biome) {
            ChunkData chunkData = super.createChunkData(world);
           
            // For everyblock in the chunk set the biome to plains
            for(int x = 0; x < 16; x++) {
                for(int z = 0; z < 16; z++) {
                    biome.setBiome(x, z, Biome.PLAINS);
                }
            }
           
            return chunkData;
        }
       
        @Override
        public boolean canSpawn(World world, int x, int z) {
            return true;
        }
       
        @Override
        public Location getFixedSpawnLocation(World world, Random random) {
            return new Location(world, 0, 128, 0);
        }
    }
    WorldHandler
    Code:
    package ladeira.world;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.WorldCreator;
    
    public class WorldHandler {
        public static Location hubSpawn;
       
        public WorldHandler() {
            createWorlds();
            hubSpawn = new Location(Bukkit.getWorld("hub"), 0, 128, 0);
        }
       
        private void createWorlds() {
            if (!(Bukkit.getWorld("hub") != null)) {
                WorldCreator creator = new WorldCreator("hub");
                creator.generator(new VoidGenerator());
                creator.createWorld();
            }
        }
    }
     
  22. Offline

    timtower Administrator Administrator Moderator

    @MrDaniel You need to create the world after the onEnable.
    Best way for that is calling "new WorldCreator" in a runTask
     
    Chr0mosom3 likes this.
  23. Offline

    Chr0mosom3

    timtower likes this.
Thread Status:
Not open for further replies.

Share This Page