Adds support for multiverse etc. by registering worlds

Must be used with BentoBox 1.24.0
#52
This commit is contained in:
tastybento 2023-06-20 21:20:53 -07:00
parent 31020374ac
commit db9af8051a
4 changed files with 62 additions and 22 deletions

View File

@ -59,13 +59,13 @@
<powermock.version>2.0.9</powermock.version> <powermock.version>2.0.9</powermock.version>
<!-- More visible way how to change dependency versions --> <!-- More visible way how to change dependency versions -->
<spigot.version>1.20-R0.1-SNAPSHOT</spigot.version> <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 variable removes warning about dynamic version -->
<revision>${build.version}-SNAPSHOT</revision> <revision>${build.version}-SNAPSHOT</revision>
<!-- Do not change unless you want different name for local builds. --> <!-- Do not change unless you want different name for local builds. -->
<build.number>-LOCAL</build.number> <build.number>-LOCAL</build.number>
<!-- This allows to change between versions. --> <!-- 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.projectKey>BentoBoxWorld_Boxed</sonar.projectKey>
<sonar.organization>bentobox-world</sonar.organization> <sonar.organization>bentobox-world</sonar.organization>

View File

@ -1,7 +1,11 @@
package world.bentobox.boxed; package world.bentobox.boxed;
import java.util.Collections; 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.Difficulty;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
@ -9,8 +13,8 @@ import org.bukkit.World.Environment;
import org.bukkit.WorldCreator; import org.bukkit.WorldCreator;
import org.bukkit.entity.SpawnCategory; import org.bukkit.entity.SpawnCategory;
import org.bukkit.generator.BiomeProvider; import org.bukkit.generator.BiomeProvider;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jdt.annotation.Nullable;
import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.api.addons.GameModeAddon;
@ -21,13 +25,14 @@ import world.bentobox.bentobox.api.configuration.WorldSettings;
import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.api.flags.Flag;
import world.bentobox.bentobox.api.flags.Flag.Mode; import world.bentobox.bentobox.api.flags.Flag.Mode;
import world.bentobox.bentobox.api.flags.Flag.Type; 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.bentobox.managers.RanksManager;
import world.bentobox.boxed.commands.AdminPlaceStructureCommand; import world.bentobox.boxed.commands.AdminPlaceStructureCommand;
import world.bentobox.boxed.generators.biomes.BoxedBiomeGenerator; import world.bentobox.boxed.generators.biomes.BoxedBiomeGenerator;
import world.bentobox.boxed.generators.biomes.NetherSeedBiomeGenerator; import world.bentobox.boxed.generators.biomes.NetherSeedBiomeGenerator;
import world.bentobox.boxed.generators.biomes.SeedBiomeGenerator; import world.bentobox.boxed.generators.biomes.SeedBiomeGenerator;
import world.bentobox.boxed.generators.chunks.AbstractBoxedChunkGenerator; 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.BoxedChunkGenerator;
import world.bentobox.boxed.generators.chunks.BoxedSeedChunkGenerator; import world.bentobox.boxed.generators.chunks.BoxedSeedChunkGenerator;
import world.bentobox.boxed.listeners.AdvancementListener; import world.bentobox.boxed.listeners.AdvancementListener;
@ -65,9 +70,9 @@ public class Boxed extends GameModeAddon {
private World baseWorldNether; private World baseWorldNether;
private World seedWorld; private World seedWorld;
private World seedWorldNether; private World seedWorldNether;
private Map<World, ChunkGenerator> generatorMap = new HashMap<>();
//private World seedWorldEnd; //private World seedWorldEnd;
private BiomeProvider boxedBiomeProvider; private BiomeProvider boxedBiomeProvider;
private BlockPopulator boxedBlockPopulator;
@Override @Override
public void onLoad() { public void onLoad() {
@ -188,21 +193,24 @@ public class Boxed extends GameModeAddon {
.createWorld(); .createWorld();
baseWorldNether.setDifficulty(Difficulty.PEACEFUL); baseWorldNether.setDifficulty(Difficulty.PEACEFUL);
baseWorldNether.setSpawnLocation(settings.getSeedX(), 64, settings.getSeedZ()); baseWorldNether.setSpawnLocation(settings.getSeedX(), 64, settings.getSeedZ());
generatorMap.put(baseWorldNether, seedBaseGen);
getPlugin().getIWM().addWorld(baseWorldNether, this);
copyChunks(baseWorldNether, seedBaseGen); copyChunks(baseWorldNether, seedBaseGen);
// Create seed world // Create seed world
// This copies a base world with custom biomes // This copies a base world with custom biomes
log("Creating Boxed Biomed Nether world ..."); log("Creating Boxed Biomed Nether world ...");
BoxedSeedChunkGenerator seedWorldNetherGenerator = new BoxedSeedChunkGenerator(this, Environment.NETHER, new NetherSeedBiomeGenerator(this, seedBaseGen));
seedWorldNether = WorldCreator seedWorldNether = WorldCreator
.name(worldName + "/" + SEED+NETHER) .name(worldName + "/" + SEED+NETHER)
.generator(new BoxedSeedChunkGenerator(this, Environment.NETHER, new NetherSeedBiomeGenerator(this, seedBaseGen))) .generator(seedWorldNetherGenerator)
.environment(Environment.NETHER) .environment(Environment.NETHER)
.seed(getSettings().getSeed()) .seed(getSettings().getSeed())
.createWorld(); .createWorld();
seedWorldNether.setDifficulty(Difficulty.EASY); seedWorldNether.setDifficulty(Difficulty.EASY);
seedWorldNether.setSpawnLocation(settings.getNetherSeedX(), 64, settings.getNetherSeedZ()); seedWorldNether.setSpawnLocation(settings.getNetherSeedX(), 64, settings.getNetherSeedZ());
generatorMap.put(seedWorldNether, seedWorldNetherGenerator);
getPlugin().getIWM().addWorld(seedWorldNether, this);
copyChunks(seedWorldNether, netherChunkGenerator); copyChunks(seedWorldNether, netherChunkGenerator);
if (getServer().getWorld(worldName + NETHER) == null) { if (getServer().getWorld(worldName + NETHER) == null) {
@ -224,14 +232,16 @@ public class Boxed extends GameModeAddon {
.createWorld(); .createWorld();
baseWorld.setDifficulty(Difficulty.PEACEFUL); baseWorld.setDifficulty(Difficulty.PEACEFUL);
baseWorld.setSpawnLocation(settings.getSeedX(), 64, settings.getSeedZ()); baseWorld.setSpawnLocation(settings.getSeedX(), 64, settings.getSeedZ());
generatorMap.put(baseWorld, seedBaseGen);
getPlugin().getIWM().addWorld(baseWorld, this);
copyChunks(baseWorld, seedBaseGen); copyChunks(baseWorld, seedBaseGen);
// Create seed world // Create seed world
// This copies a base world with custom biomes // This copies a base world with custom biomes
log("Creating Boxed Biomed world ..."); log("Creating Boxed Biomed world ...");
BoxedSeedChunkGenerator seedWorldGenerator = new BoxedSeedChunkGenerator(this, Environment.NORMAL, new SeedBiomeGenerator(this, seedBaseGen));
seedWorld = WorldCreator seedWorld = WorldCreator
.name(worldName + "/" + SEED) .name(worldName + "/" + SEED)
.generator(new BoxedSeedChunkGenerator(this, Environment.NORMAL, new SeedBiomeGenerator(this, seedBaseGen))) .generator(seedWorldGenerator)
.environment(Environment.NORMAL) .environment(Environment.NORMAL)
.seed(getSettings().getSeed()) .seed(getSettings().getSeed())
.createWorld(); .createWorld();
@ -239,6 +249,8 @@ public class Boxed extends GameModeAddon {
seedWorld.setSpawnLocation(settings.getSeedX(), 64, settings.getSeedZ()); seedWorld.setSpawnLocation(settings.getSeedX(), 64, settings.getSeedZ());
generatorMap.put(seedWorld, seedWorldGenerator);
getPlugin().getIWM().addWorld(seedWorld, this);
copyChunks(seedWorld, chunkGenerator); copyChunks(seedWorld, chunkGenerator);
@ -251,6 +263,26 @@ public class Boxed extends GameModeAddon {
islandWorld = getWorld(worldName, World.Environment.NORMAL); 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 * Copies chunks from the seed world so they can be pasted in the game world
@ -307,10 +339,9 @@ public class Boxed extends GameModeAddon {
worldName2 = env.equals(World.Environment.NETHER) ? worldName2 + NETHER : worldName2; worldName2 = env.equals(World.Environment.NETHER) ? worldName2 + NETHER : worldName2;
worldName2 = env.equals(World.Environment.THE_END) ? worldName2 + THE_END : worldName2; worldName2 = env.equals(World.Environment.THE_END) ? worldName2 + THE_END : worldName2;
boxedBiomeProvider = new BoxedBiomeGenerator(this); boxedBiomeProvider = new BoxedBiomeGenerator(this);
boxedBlockPopulator = new BoxedBlockPopulator(this);
World w = WorldCreator World w = WorldCreator
.name(worldName2) .name(worldName2)
.generator(env.equals(World.Environment.NETHER) ? netherChunkGenerator : chunkGenerator) .generator(getChunkGenerator(env))
.environment(env) .environment(env)
.seed(seedWorld.getSeed()) // For development .seed(seedWorld.getSeed()) // For development
.createWorld(); .createWorld();
@ -318,6 +349,8 @@ public class Boxed extends GameModeAddon {
if (w != null) { if (w != null) {
setSpawnRates(w); setSpawnRates(w);
} }
// Store main generators
generatorMap.put(w, getChunkGenerator(env));
return w; return w;
} }
@ -357,7 +390,12 @@ public class Boxed extends GameModeAddon {
@Override @Override
public @Nullable ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { 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 @Override
@ -374,6 +412,9 @@ public class Boxed extends GameModeAddon {
public void allLoaded() { public void allLoaded() {
// Save settings. This will occur after all addons have loaded // Save settings. This will occur after all addons have loaded
this.saveWorldSettings(); this.saveWorldSettings();
// Register generators for worlds with multiverse etc.
this.log("Registering Boxed worlds with other plugins (if applicable)...");
generatorMap.keySet().forEach(this::registerToWorldManagementPlugins);
} }
/** /**
@ -383,13 +424,6 @@ public class Boxed extends GameModeAddon {
return advManager; return advManager;
} }
/**
* @return the boxedBlockPopulator
*/
public BlockPopulator getBoxedBlockPopulator() {
return boxedBlockPopulator;
}
@Override @Override
public boolean isUsesNewChunkGeneration() { public boolean isUsesNewChunkGeneration() {
return true; return true;

View File

@ -45,9 +45,12 @@ import world.bentobox.boxed.Boxed;
* *
*/ */
public class BoxedChunkGenerator extends AbstractBoxedChunkGenerator { public class BoxedChunkGenerator extends AbstractBoxedChunkGenerator {
private final BlockPopulator boxedBlockPopulator;
public BoxedChunkGenerator(Boxed addon) { public BoxedChunkGenerator(Boxed addon) {
super(addon); super(addon);
boxedBlockPopulator = new BoxedBlockPopulator(addon);
} }
@Override @Override
@ -57,7 +60,10 @@ public class BoxedChunkGenerator extends AbstractBoxedChunkGenerator {
@Override @Override
public List<BlockPopulator> getDefaultPopulators(World world) { 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(); return world.getPopulators();
} }

View File

@ -1,7 +1,7 @@
name: Boxed name: Boxed
main: world.bentobox.boxed.Boxed main: world.bentobox.boxed.Boxed
version: ${version}${build.number} version: ${version}${build.number}
api-version: 1.22 api-version: 1.24
metrics: true metrics: true
icon: "COMPOSTER" icon: "COMPOSTER"
repository: "BentoBoxWorld/Boxed" repository: "BentoBoxWorld/Boxed"