Merge pull request #3004 from Multiverse/dtm/mv5/world-revamp-continue-tweaks

Tweaks for world revamp
This commit is contained in:
Jeremy Wood 2023-09-09 11:19:22 -04:00 committed by GitHub
commit 34b55e4b4d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 79 additions and 82 deletions

View File

@ -451,6 +451,7 @@
value="Method type name ''{0}'' must match pattern ''{1}''."/>
</module>
<module name="PackageName">
<property name="severity" value="info"/>
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
<message key="name.invalidPattern"
value="Package name ''{0}'' must match pattern ''{1}''."/>

View File

@ -5,7 +5,10 @@ import com.google.common.base.Strings;
import com.onarandombox.MultiverseCore.api.BlockSafety;
import com.onarandombox.MultiverseCore.api.LocationManipulation;
import com.onarandombox.MultiverseCore.api.SafeTTeleporter;
import com.onarandombox.MultiverseCore.utils.message.MessageReplacement;
import com.onarandombox.MultiverseCore.utils.result.FailureReason;
import com.onarandombox.MultiverseCore.utils.result.Result;
import com.onarandombox.MultiverseCore.utils.result.SuccessReason;
import com.onarandombox.MultiverseCore.worldnew.config.WorldConfig;
import com.onarandombox.MultiverseCore.worldnew.config.WorldsConfigManager;
import com.onarandombox.MultiverseCore.worldnew.generators.GeneratorProvider;
@ -54,8 +57,6 @@ import static com.onarandombox.MultiverseCore.worldnew.helpers.DataStore.WorldCo
@Service
public class WorldManager {
private static final String WORLD_PLACEHOLDER = "{world}";
private static final String ERROR_PLACEHOLDER = "{error}";
private static final List<String> CLONE_IGNORE_FILES = Arrays.asList("uid.dat", "session.lock");
private final Map<String, MultiverseWorld> worldsMap;
@ -167,21 +168,17 @@ public class WorldManager {
public Result<CreateWorldResult.Success, CreateWorldResult.Failure> createWorld(CreateWorldOptions options) {
// Params validations
if (!worldNameChecker.isValidWorldName(options.worldName())) {
return Result.failure(CreateWorldResult.Failure.INVALID_WORLDNAME,
replace(WORLD_PLACEHOLDER).with(options.worldName()));
return worldActionResult(CreateWorldResult.Failure.INVALID_WORLDNAME, options.worldName());
}
if (getLoadedWorld(options.worldName()).isDefined()) {
return Result.failure(CreateWorldResult.Failure.WORLD_EXIST_LOADED,
replace(WORLD_PLACEHOLDER).with(options.worldName()));
return worldActionResult(CreateWorldResult.Failure.WORLD_EXIST_LOADED, options.worldName());
}
if (getWorld(options.worldName()).isDefined()) {
return Result.failure(CreateWorldResult.Failure.WORLD_EXIST_UNLOADED,
replace(WORLD_PLACEHOLDER).with(options.worldName()));
return worldActionResult(CreateWorldResult.Failure.WORLD_EXIST_UNLOADED, options.worldName());
}
File worldFolder = new File(Bukkit.getWorldContainer(), options.worldName());
if (worldFolder.exists()) {
return Result.failure(CreateWorldResult.Failure.WORLD_EXIST_FOLDER,
replace(WORLD_PLACEHOLDER).with(options.worldName()));
return worldActionResult(CreateWorldResult.Failure.WORLD_EXIST_FOLDER, options.worldName());
}
String parsedGenerator = parseGenerator(options.worldName(), options.generator());
@ -192,16 +189,15 @@ public class WorldManager {
.seed(options.seed())
.type(options.worldType()))
.fold(
exception -> Result.failure(CreateWorldResult.Failure.BUKKIT_CREATION_FAILED,
replace(WORLD_PLACEHOLDER).with(options.worldName()),
replace(ERROR_PLACEHOLDER).with(exception.getMessage())),
exception -> worldActionResult(CreateWorldResult.Failure.BUKKIT_CREATION_FAILED,
options.worldName(), exception.getMessage()),
world -> {
newLoadedMultiverseWorld(world, parsedGenerator, options.useSpawnAdjust());
return Result.success(CreateWorldResult.Success.CREATED,
replace(WORLD_PLACEHOLDER).with(world.getName()));
return worldActionResult(CreateWorldResult.Success.CREATED, world.getName());
});
}
/**
* Imports an existing world folder.
*
@ -211,20 +207,16 @@ public class WorldManager {
public Result<ImportWorldResult.Success, ImportWorldResult.Failure> importWorld(ImportWorldOptions options) {
// Params validations
if (!worldNameChecker.isValidWorldName(options.worldName())) {
return Result.failure(ImportWorldResult.Failure.INVALID_WORLDNAME,
replace(WORLD_PLACEHOLDER).with(options.worldName()));
return worldActionResult(ImportWorldResult.Failure.INVALID_WORLDNAME, options.worldName());
}
if (!worldNameChecker.isValidWorldFolder(options.worldName())) {
return Result.failure(ImportWorldResult.Failure.WORLD_FOLDER_INVALID,
replace(WORLD_PLACEHOLDER).with(options.worldName()));
return worldActionResult(ImportWorldResult.Failure.WORLD_FOLDER_INVALID, options.worldName());
}
if (isLoadedWorld(options.worldName())) {
return Result.failure(ImportWorldResult.Failure.WORLD_EXIST_LOADED,
replace(WORLD_PLACEHOLDER).with(options.worldName()));
return worldActionResult(ImportWorldResult.Failure.WORLD_EXIST_LOADED, options.worldName());
}
if (isWorld(options.worldName())) {
return Result.failure(ImportWorldResult.Failure.WORLD_EXIST_UNLOADED,
replace(WORLD_PLACEHOLDER).with(options.worldName()));
return worldActionResult(ImportWorldResult.Failure.WORLD_EXIST_UNLOADED, options.worldName());
}
String parsedGenerator = parseGenerator(options.worldName(), options.generator());
@ -232,13 +224,11 @@ public class WorldManager {
.environment(options.environment())
.generator(parsedGenerator))
.fold(
exception -> Result.failure(ImportWorldResult.Failure.BUKKIT_CREATION_FAILED,
replace(WORLD_PLACEHOLDER).with(options.worldName()),
replace(ERROR_PLACEHOLDER).with(exception.getMessage())),
exception -> worldActionResult(ImportWorldResult.Failure.BUKKIT_CREATION_FAILED,
options.worldName(), exception.getMessage()),
world -> {
newLoadedMultiverseWorld(world, parsedGenerator, options.useSpawnAdjust());
return Result.success(ImportWorldResult.Success.IMPORTED,
replace(WORLD_PLACEHOLDER).with(options.worldName()));
return worldActionResult(ImportWorldResult.Success.IMPORTED, options.worldName());
});
}
@ -290,10 +280,8 @@ public class WorldManager {
return getWorld(worldName)
.map(this::loadWorld)
.getOrElse(() -> worldNameChecker.isValidWorldFolder(worldName)
? Result.failure(LoadWorldResult.Failure.WORLD_EXIST_FOLDER,
replace(WORLD_PLACEHOLDER).with(worldName))
: Result.failure(LoadWorldResult.Failure.WORLD_NON_EXISTENT,
replace(WORLD_PLACEHOLDER).with(worldName)));
? worldActionResult(LoadWorldResult.Failure.WORLD_EXIST_FOLDER, worldName)
: worldActionResult(LoadWorldResult.Failure.WORLD_NON_EXISTENT, worldName));
}
/**
@ -307,22 +295,19 @@ public class WorldManager {
if (loadTracker.contains(mvWorld.getName())) {
// This is to prevent recursive calls by WorldLoadEvent
Logging.fine("World already loading: " + mvWorld.getName());
return Result.failure(LoadWorldResult.Failure.WORLD_ALREADY_LOADING,
replace(WORLD_PLACEHOLDER).with(mvWorld.getName()));
return worldActionResult(LoadWorldResult.Failure.WORLD_ALREADY_LOADING, mvWorld.getName());
}
if (isLoadedWorld(mvWorld)) {
Logging.severe("World already loaded: " + mvWorld.getName());
return Result.failure(LoadWorldResult.Failure.WORLD_EXIST_LOADED,
replace(WORLD_PLACEHOLDER).with(mvWorld.getName()));
return worldActionResult(LoadWorldResult.Failure.WORLD_EXIST_LOADED, mvWorld.getName());
}
return createBukkitWorld(WorldCreator.name(mvWorld.getName())
.environment(mvWorld.getEnvironment())
.generator(Strings.isNullOrEmpty(mvWorld.getGenerator()) ? null : mvWorld.getGenerator())
.seed(mvWorld.getSeed())).fold(
exception -> Result.failure(LoadWorldResult.Failure.BUKKIT_CREATION_FAILED,
replace(WORLD_PLACEHOLDER).with(mvWorld.getName()),
replace(ERROR_PLACEHOLDER).with(exception.getMessage())),
exception -> worldActionResult(LoadWorldResult.Failure.BUKKIT_CREATION_FAILED,
mvWorld.getName(), exception.getMessage()),
world -> {
// TODO: Check worldConfig null
WorldConfig worldConfig = worldsConfigManager.getWorldConfig(mvWorld.getName());
@ -334,8 +319,7 @@ public class WorldManager {
locationManipulation);
loadedWorldsMap.put(loadedWorld.getName(), loadedWorld);
saveWorldsConfig();
return Result.success(LoadWorldResult.Success.LOADED,
replace(WORLD_PLACEHOLDER).with(loadedWorld.getName()));
return worldActionResult(LoadWorldResult.Success.LOADED, loadedWorld.getName());
});
}
@ -359,10 +343,8 @@ public class WorldManager {
return getLoadedWorld(worldName)
.map(this::unloadWorld)
.getOrElse(() -> isUnloadedWorld(worldName)
? Result.failure(UnloadWorldResult.Failure.WORLD_UNLOADED,
replace(WORLD_PLACEHOLDER).with(worldName))
: Result.failure(UnloadWorldResult.Failure.WORLD_NON_EXISTENT,
replace(WORLD_PLACEHOLDER).with(worldName)));
? worldActionResult(UnloadWorldResult.Failure.WORLD_UNLOADED, worldName)
: worldActionResult(UnloadWorldResult.Failure.WORLD_NON_EXISTENT, worldName));
}
/**
@ -376,27 +358,23 @@ public class WorldManager {
if (unloadTracker.contains(world.getName())) {
// This is to prevent recursive calls by WorldUnloadEvent
Logging.fine("World already unloading: " + world.getName());
return Result.failure(UnloadWorldResult.Failure.WORLD_ALREADY_UNLOADING,
replace(WORLD_PLACEHOLDER).with(world.getName()));
return worldActionResult(UnloadWorldResult.Failure.WORLD_ALREADY_UNLOADING, world.getName());
}
// TODO: removePlayersFromWorld?
return unloadBukkitWorld(world.getBukkitWorld().getOrNull()).fold(
exception -> Result.failure(UnloadWorldResult.Failure.BUKKIT_UNLOAD_FAILED,
replace(WORLD_PLACEHOLDER).with(world.getName()),
replace(ERROR_PLACEHOLDER).with(exception.getMessage())),
exception -> worldActionResult(UnloadWorldResult.Failure.BUKKIT_UNLOAD_FAILED,
world.getName(), exception.getMessage()),
success -> Option.of(loadedWorldsMap.remove(world.getName())).fold(
() -> {
Logging.severe("Failed to remove world from map: " + world.getName());
return Result.failure(UnloadWorldResult.Failure.WORLD_NON_EXISTENT,
replace(WORLD_PLACEHOLDER).with(world.getName()));
return worldActionResult(UnloadWorldResult.Failure.WORLD_NON_EXISTENT, world.getName());
},
mvWorld -> {
Logging.fine("Removed MultiverseWorld from map: " + world.getName());
mvWorld.getWorldConfig().deferenceMVWorld();
return Result.success(UnloadWorldResult.Success.UNLOADED,
replace(WORLD_PLACEHOLDER).with(world.getName()));
return worldActionResult(UnloadWorldResult.Success.UNLOADED, world.getName());
}));
}
@ -411,8 +389,7 @@ public class WorldManager {
removeWorld(@NotNull String worldName) {
return getWorld(worldName)
.map(this::removeWorld)
.getOrElse(() -> Result.failure(RemoveWorldResult.Failure.WORLD_NON_EXISTENT,
replace(WORLD_PLACEHOLDER).with(worldName)));
.getOrElse(() -> worldActionResult(RemoveWorldResult.Failure.WORLD_NON_EXISTENT, worldName));
}
/**
@ -470,8 +447,7 @@ public class WorldManager {
public Result<DeleteWorldResult.Success, DeleteWorldResult.Failure> deleteWorld(@NotNull String worldName) {
return getWorld(worldName)
.map(this::deleteWorld)
.getOrElse(() -> Result.failure(DeleteWorldResult.Failure.WORLD_NON_EXISTENT,
replace(WORLD_PLACEHOLDER).with(worldName)));
.getOrElse(() -> worldActionResult(DeleteWorldResult.Failure.WORLD_NON_EXISTENT, worldName));
}
/**
@ -486,8 +462,7 @@ public class WorldManager {
() -> {
var result = loadWorld(world);
if (result.isFailure()) {
return Result.failure(DeleteWorldResult.Failure.LOAD_FAILED,
replace(WORLD_PLACEHOLDER).with(world.getName()));
return worldActionResult(DeleteWorldResult.Failure.LOAD_FAILED, world.getName());
}
return deleteWorld(world);
},
@ -505,8 +480,7 @@ public class WorldManager {
File worldFolder = world.getBukkitWorld().map(World::getWorldFolder).getOrNull();
if (worldFolder == null || !worldNameChecker.isValidWorldFolder(worldFolder)) {
Logging.severe("Failed to get world folder for world: " + world.getName());
return Result.failure(DeleteWorldResult.Failure.WORLD_FOLDER_NOT_FOUND,
replace(WORLD_PLACEHOLDER).with(world.getName()));
return worldActionResult(DeleteWorldResult.Failure.WORLD_FOLDER_NOT_FOUND, world.getName());
}
var result = removeWorld(world);
@ -517,11 +491,9 @@ public class WorldManager {
// Erase world files from disk
// TODO: Possible config options to keep certain files
return filesManipulator.deleteFolder(worldFolder).fold(
exception -> Result.failure(DeleteWorldResult.Failure.FAILED_TO_DELETE_FOLDER,
replace(WORLD_PLACEHOLDER).with(world.getName()),
replace(ERROR_PLACEHOLDER).with(exception.getMessage())),
success -> Result.success(DeleteWorldResult.Success.DELETED,
replace(WORLD_PLACEHOLDER).with(world.getName())));
exception -> worldActionResult(DeleteWorldResult.Failure.FAILED_TO_DELETE_FOLDER,
world.getName(), exception.getMessage()),
success -> worldActionResult(DeleteWorldResult.Success.DELETED, world.getName()));
}
/**
@ -542,13 +514,12 @@ public class WorldManager {
failure.getReasonMessage()),
success -> Result.success()))
.onSuccessThen(s -> getLoadedWorld(options.newWorldName()).fold(
() -> Result.failure(CloneWorldResult.Failure.MV_WORLD_FAILED,
replace(WORLD_PLACEHOLDER).with(options.newWorldName())),
() -> worldActionResult(CloneWorldResult.Failure.MV_WORLD_FAILED, options.newWorldName()),
mvWorld -> {
cloneWorldTransferData(options, mvWorld);
saveWorldsConfig();
return Result.success(CloneWorldResult.Success.CLONED,
replace(WORLD_PLACEHOLDER).with(options.world().getName()),
replaceWorldName(options.world().getName()),
replace("{newworld}").with(mvWorld.getName()));
}));
}
@ -558,22 +529,18 @@ public class WorldManager {
String newWorldName = options.newWorldName();
if (!worldNameChecker.isValidWorldName(newWorldName)) {
Logging.severe("Invalid world name: " + newWorldName);
return Result.failure(CloneWorldResult.Failure.INVALID_WORLDNAME,
replace(WORLD_PLACEHOLDER).with(newWorldName));
return worldActionResult(CloneWorldResult.Failure.INVALID_WORLDNAME, newWorldName);
}
if (worldNameChecker.isValidWorldFolder(newWorldName)) {
return Result.failure(CloneWorldResult.Failure.WORLD_EXIST_FOLDER,
replace(WORLD_PLACEHOLDER).with(newWorldName));
return worldActionResult(CloneWorldResult.Failure.WORLD_EXIST_FOLDER, newWorldName);
}
if (isLoadedWorld(newWorldName)) {
Logging.severe("World already loaded when attempting to clone: " + newWorldName);
return Result.failure(CloneWorldResult.Failure.WORLD_EXIST_LOADED,
replace(WORLD_PLACEHOLDER).with(newWorldName));
return worldActionResult(CloneWorldResult.Failure.WORLD_EXIST_LOADED, newWorldName);
}
if (isWorld(newWorldName)) {
Logging.severe("World already exist unloaded: " + newWorldName);
return Result.failure(CloneWorldResult.Failure.WORLD_EXIST_UNLOADED,
replace(WORLD_PLACEHOLDER).with(newWorldName));
return worldActionResult(CloneWorldResult.Failure.WORLD_EXIST_UNLOADED, newWorldName);
}
return Result.success();
}
@ -584,9 +551,8 @@ public class WorldManager {
File worldFolder = options.world().getBukkitWorld().map(World::getWorldFolder).getOrNull();
File newWorldFolder = new File(Bukkit.getWorldContainer(), options.newWorldName());
return filesManipulator.copyFolder(worldFolder, newWorldFolder, CLONE_IGNORE_FILES).fold(
exception -> Result.failure(CloneWorldResult.Failure.COPY_FAILED,
replace(WORLD_PLACEHOLDER).with(options.world().getName()),
replace(ERROR_PLACEHOLDER).with(exception.getMessage())),
exception -> worldActionResult(CloneWorldResult.Failure.COPY_FAILED, options.world().getName(),
exception.getMessage()),
success -> Result.success());
}
@ -647,7 +613,30 @@ public class WorldManager {
dataTransfer.pasteAllTo(newWorld);
saveWorldsConfig();
});
return Result.success(RegenWorldResult.Success.REGENERATED, replace(WORLD_PLACEHOLDER).with(world.getName()));
return worldActionResult(RegenWorldResult.Success.REGENERATED, world.getName());
}
private <F extends FailureReason, S extends SuccessReason> Result<S, F> worldActionResult(
@NotNull S messageKeyProvider, @NotNull String worldName) {
return Result.success(messageKeyProvider, replaceWorldName(worldName));
}
private <F extends FailureReason, S extends SuccessReason> Result<S, F> worldActionResult(
@NotNull F messageKeyProvider, @NotNull String worldName) {
return Result.failure(messageKeyProvider, replaceWorldName(worldName));
}
private <F extends FailureReason, S extends SuccessReason> Result<S, F> worldActionResult(
@NotNull F messageKeyProvider, @NotNull String worldName, @NotNull String errorMessage) {
return Result.failure(messageKeyProvider, replaceWorldName(worldName), replaceError(errorMessage));
}
private MessageReplacement replaceWorldName(@NotNull String worldName) {
return replace("{world}").with(worldName);
}
private MessageReplacement replaceError(@NotNull String errorMessage) {
return replace("{error}").with(errorMessage);
}
/**

View File

@ -0,0 +1 @@
package com.onarandombox.MultiverseCore.worldnew.config;

View File

@ -0,0 +1 @@
package com.onarandombox.MultiverseCore.worldnew.entrycheck;

View File

@ -0,0 +1 @@
package com.onarandombox.MultiverseCore.worldnew.generators;

View File

@ -0,0 +1 @@
package com.onarandombox.MultiverseCore.worldnew.helpers;

View File

@ -0,0 +1 @@
package com.onarandombox.MultiverseCore.worldnew.options;

View File

@ -0,0 +1 @@
package com.onarandombox.MultiverseCore.worldnew;

View File

@ -0,0 +1 @@
package com.onarandombox.MultiverseCore.worldnew.results;