Skip to content

Commit 841ad8f

Browse files
authored
Merge pull request #3210 from Multiverse/feat/clone-save
Add an option to force save world to disk before cloning world
2 parents 49bdb56 + 5b85e2f commit 841ad8f

File tree

3 files changed

+32
-3
lines changed

3 files changed

+32
-3
lines changed

src/main/java/org/mvplugins/multiverse/core/commands/CloneCommand.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ void onCloneCommand(
6666
CloneWorldOptions cloneWorldOptions = CloneWorldOptions.fromTo(world, newWorldName)
6767
.keepWorldConfig(!parsedFlags.hasFlag(flags.resetWorldConfig))
6868
.keepGameRule(!parsedFlags.hasFlag(flags.resetGamerules))
69-
.keepWorldBorder(!parsedFlags.hasFlag(flags.resetWorldBorder));
69+
.keepWorldBorder(!parsedFlags.hasFlag(flags.resetWorldBorder))
70+
.forceSave(parsedFlags.hasFlag(flags.forceSave));
7071
worldManager.cloneWorld(cloneWorldOptions)
7172
.onSuccess(newWorld -> {
7273
Logging.fine("World clone success: " + newWorld);
@@ -98,6 +99,10 @@ private Flags(@NotNull CommandFlagsManager flagsManager) {
9899
private final CommandFlag resetWorldBorder = flag(CommandFlag.builder("--reset-world-border")
99100
.addAlias("-wb")
100101
.build());
102+
103+
private final CommandFlag forceSave = flag(CommandFlag.builder("--force-save")
104+
.addAlias("-s")
105+
.build());
101106
}
102107

103108
@Service

src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -612,8 +612,11 @@ private Attempt<CloneWorldOptions, CloneFailureReason> cloneWorldValidateWorld(
612612
return worldActionResult(options);
613613
}
614614

615-
private Attempt<CloneWorldOptions, CloneFailureReason> cloneWorldCopyFolder(
616-
@NotNull CloneWorldOptions options) {
615+
private Attempt<CloneWorldOptions, CloneFailureReason> cloneWorldCopyFolder(@NotNull CloneWorldOptions options) {
616+
if (options.forceSave()) {
617+
Logging.finer("Force saving world before cloning: " + options.world().getName());
618+
options.world().getBukkitWorld().peek(World::save);
619+
}
617620
File worldFolder = options.world().getBukkitWorld().map(World::getWorldFolder).get();
618621
File newWorldFolder = new File(Bukkit.getWorldContainer(), options.newWorldName());
619622
return fileUtils.copyFolder(worldFolder, newWorldFolder, CLONE_IGNORE_FILES).fold(

src/main/java/org/mvplugins/multiverse/core/world/options/CloneWorldOptions.java

+21
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public static CloneWorldOptions fromTo(LoadedMultiverseWorld world, String newWo
2323
private final String newWorldName;
2424
private boolean keepGameRule = true;
2525
private boolean keepWorldConfig = true;
26+
private boolean forceSave = false;
2627

2728
private boolean keepWorldBorder = true;
2829

@@ -115,4 +116,24 @@ public boolean keepWorldConfig() {
115116
public boolean keepWorldBorder() {
116117
return keepWorldBorder;
117118
}
119+
120+
/**
121+
* Sets whether to force save the world to disk before clone copying.
122+
*
123+
* @param forceSaveInput Whether to force save the world to disk before clone copying.
124+
* @return This {@link CloneWorldOptions} instance.
125+
*/
126+
public @NotNull CloneWorldOptions forceSave(boolean forceSaveInput) {
127+
this.forceSave = forceSaveInput;
128+
return this;
129+
}
130+
131+
/**
132+
* Gets whether to force save the world to disk before clone copying.
133+
*
134+
* @return Whether to force save the world to disk before clone copying.
135+
*/
136+
public boolean forceSave() {
137+
return forceSave;
138+
}
118139
}

0 commit comments

Comments
 (0)