Skip to content

Commit

Permalink
Adds support for multiverse etc. by registering worlds
Browse files Browse the repository at this point in the history
Must be used with BentoBox 1.24.0
#52
  • Loading branch information
tastybento committed Jun 21, 2023
1 parent 3102037 commit db9af80
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 22 deletions.
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,13 @@
<powermock.version>2.0.9</powermock.version>
<!-- More visible way how to change dependency versions -->
<spigot.version>1.20-R0.1-SNAPSHOT</spigot.version>
<bentobox.version>1.23.0</bentobox.version>
<bentobox.version>1.24.0-SNAPSHOT</bentobox.version>
<!-- Revision variable removes warning about dynamic version -->
<revision>${build.version}-SNAPSHOT</revision>
<!-- Do not change unless you want different name for local builds. -->
<build.number>-LOCAL</build.number>
<!-- This allows to change between versions. -->
<build.version>2.2.0</build.version>
<build.version>2.2.1</build.version>

<sonar.projectKey>BentoBoxWorld_Boxed</sonar.projectKey>
<sonar.organization>bentobox-world</sonar.organization>
Expand Down
70 changes: 52 additions & 18 deletions src/main/java/world/bentobox/boxed/Boxed.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
package world.bentobox.boxed;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.bukkit.Bukkit;
import org.bukkit.Difficulty;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.WorldCreator;
import org.bukkit.entity.SpawnCategory;
import org.bukkit.generator.BiomeProvider;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;

import world.bentobox.bentobox.api.addons.GameModeAddon;
Expand All @@ -21,13 +25,14 @@
import world.bentobox.bentobox.api.flags.Flag;
import world.bentobox.bentobox.api.flags.Flag.Mode;
import world.bentobox.bentobox.api.flags.Flag.Type;
import world.bentobox.bentobox.api.hooks.Hook;
import world.bentobox.bentobox.hooks.WorldManagementHook;
import world.bentobox.bentobox.managers.RanksManager;
import world.bentobox.boxed.commands.AdminPlaceStructureCommand;
import world.bentobox.boxed.generators.biomes.BoxedBiomeGenerator;
import world.bentobox.boxed.generators.biomes.NetherSeedBiomeGenerator;
import world.bentobox.boxed.generators.biomes.SeedBiomeGenerator;
import world.bentobox.boxed.generators.chunks.AbstractBoxedChunkGenerator;
import world.bentobox.boxed.generators.chunks.BoxedBlockPopulator;
import world.bentobox.boxed.generators.chunks.BoxedChunkGenerator;
import world.bentobox.boxed.generators.chunks.BoxedSeedChunkGenerator;
import world.bentobox.boxed.listeners.AdvancementListener;
Expand Down Expand Up @@ -65,9 +70,9 @@ public class Boxed extends GameModeAddon {
private World baseWorldNether;
private World seedWorld;
private World seedWorldNether;
private Map<World, ChunkGenerator> generatorMap = new HashMap<>();
//private World seedWorldEnd;
private BiomeProvider boxedBiomeProvider;
private BlockPopulator boxedBlockPopulator;

@Override
public void onLoad() {
Expand Down Expand Up @@ -188,21 +193,24 @@ private void createNether(String worldName) {
.createWorld();
baseWorldNether.setDifficulty(Difficulty.PEACEFUL);
baseWorldNether.setSpawnLocation(settings.getSeedX(), 64, settings.getSeedZ());
generatorMap.put(baseWorldNether, seedBaseGen);
getPlugin().getIWM().addWorld(baseWorldNether, this);
copyChunks(baseWorldNether, seedBaseGen);
// Create seed world
// This copies a base world with custom biomes
log("Creating Boxed Biomed Nether world ...");

BoxedSeedChunkGenerator seedWorldNetherGenerator = new BoxedSeedChunkGenerator(this, Environment.NETHER, new NetherSeedBiomeGenerator(this, seedBaseGen));
seedWorldNether = WorldCreator
.name(worldName + "/" + SEED+NETHER)
.generator(new BoxedSeedChunkGenerator(this, Environment.NETHER, new NetherSeedBiomeGenerator(this, seedBaseGen)))
.generator(seedWorldNetherGenerator)
.environment(Environment.NETHER)
.seed(getSettings().getSeed())
.createWorld();
seedWorldNether.setDifficulty(Difficulty.EASY);

seedWorldNether.setSpawnLocation(settings.getNetherSeedX(), 64, settings.getNetherSeedZ());

generatorMap.put(seedWorldNether, seedWorldNetherGenerator);
getPlugin().getIWM().addWorld(seedWorldNether, this);
copyChunks(seedWorldNether, netherChunkGenerator);

if (getServer().getWorld(worldName + NETHER) == null) {
Expand All @@ -224,21 +232,25 @@ private void createOverWorld(String worldName) {
.createWorld();
baseWorld.setDifficulty(Difficulty.PEACEFUL);
baseWorld.setSpawnLocation(settings.getSeedX(), 64, settings.getSeedZ());
generatorMap.put(baseWorld, seedBaseGen);
getPlugin().getIWM().addWorld(baseWorld, this);
copyChunks(baseWorld, seedBaseGen);
// Create seed world
// This copies a base world with custom biomes
log("Creating Boxed Biomed world ...");

BoxedSeedChunkGenerator seedWorldGenerator = new BoxedSeedChunkGenerator(this, Environment.NORMAL, new SeedBiomeGenerator(this, seedBaseGen));
seedWorld = WorldCreator
.name(worldName + "/" + SEED)
.generator(new BoxedSeedChunkGenerator(this, Environment.NORMAL, new SeedBiomeGenerator(this, seedBaseGen)))
.generator(seedWorldGenerator)
.environment(Environment.NORMAL)
.seed(getSettings().getSeed())
.createWorld();
seedWorld.setDifficulty(Difficulty.EASY);

seedWorld.setSpawnLocation(settings.getSeedX(), 64, settings.getSeedZ());

generatorMap.put(seedWorld, seedWorldGenerator);
getPlugin().getIWM().addWorld(seedWorld, this);
copyChunks(seedWorld, chunkGenerator);


Expand All @@ -251,6 +263,26 @@ private void createOverWorld(String worldName) {
islandWorld = getWorld(worldName, World.Environment.NORMAL);

}

/**
* Registers a world with world management plugins
*
* @param world the World to register
* @param islandWorld true if this is an island world
*/
private void registerToWorldManagementPlugins(@NonNull World world) {
if (getPlugin().getHooks() != null) {
for (Hook hook : getPlugin().getHooks().getHooks()) {
if (hook instanceof final WorldManagementHook worldManagementHook) {
if (Bukkit.isPrimaryThread()) {
worldManagementHook.registerWorld(world, true);
} else {
Bukkit.getScheduler().runTask(getPlugin(), () -> worldManagementHook.registerWorld(world, true));
}
}
}
}
}

/**
* Copies chunks from the seed world so they can be pasted in the game world
Expand Down Expand Up @@ -307,17 +339,18 @@ private World getWorld(String worldName2, Environment env) {
worldName2 = env.equals(World.Environment.NETHER) ? worldName2 + NETHER : worldName2;
worldName2 = env.equals(World.Environment.THE_END) ? worldName2 + THE_END : worldName2;
boxedBiomeProvider = new BoxedBiomeGenerator(this);
boxedBlockPopulator = new BoxedBlockPopulator(this);
World w = WorldCreator
.name(worldName2)
.generator(env.equals(World.Environment.NETHER) ? netherChunkGenerator : chunkGenerator)
.generator(getChunkGenerator(env))
.environment(env)
.seed(seedWorld.getSeed()) // For development
.createWorld();
// Set spawn rates
if (w != null) {
setSpawnRates(w);
}
// Store main generators
generatorMap.put(w, getChunkGenerator(env));
return w;

}
Expand Down Expand Up @@ -357,7 +390,12 @@ public WorldSettings getWorldSettings() {

@Override
public @Nullable ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
return worldName.endsWith(NETHER) ? netherChunkGenerator : chunkGenerator;
for (Entry<World, ChunkGenerator> en : generatorMap.entrySet()) {
if (en.getKey().getName().equalsIgnoreCase(worldName)) {
return en.getValue();
}
}
return null;
}

@Override
Expand All @@ -374,6 +412,9 @@ public void saveWorldSettings() {
public void allLoaded() {
// Save settings. This will occur after all addons have loaded
this.saveWorldSettings();
// Register generators for worlds with multiverse etc.
this.log("Registering Boxed worlds with other plugins (if applicable)...");
generatorMap.keySet().forEach(this::registerToWorldManagementPlugins);
}

/**
Expand All @@ -383,13 +424,6 @@ public AdvancementsManager getAdvManager() {
return advManager;
}

/**
* @return the boxedBlockPopulator
*/
public BlockPopulator getBoxedBlockPopulator() {
return boxedBlockPopulator;
}

@Override
public boolean isUsesNewChunkGeneration() {
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,12 @@
*
*/
public class BoxedChunkGenerator extends AbstractBoxedChunkGenerator {

private final BlockPopulator boxedBlockPopulator;

public BoxedChunkGenerator(Boxed addon) {
super(addon);
boxedBlockPopulator = new BoxedBlockPopulator(addon);
}

@Override
Expand All @@ -57,7 +60,10 @@ public BiomeProvider getDefaultBiomeProvider(WorldInfo worldInfo) {

@Override
public List<BlockPopulator> getDefaultPopulators(World world) {
world.getPopulators().add(addon.getBoxedBlockPopulator());
// Only add it once
if (!world.getPopulators().contains(boxedBlockPopulator)) {
world.getPopulators().add(boxedBlockPopulator);
}
return world.getPopulators();
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/addon.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: Boxed
main: world.bentobox.boxed.Boxed
version: ${version}${build.number}
api-version: 1.22
api-version: 1.24
metrics: true
icon: "COMPOSTER"
repository: "BentoBoxWorld/Boxed"
Expand Down

0 comments on commit db9af80

Please sign in to comment.