diff --git a/SpigotCore_14/src/de/steamwar/core/FlatteningWrapper14.java b/SpigotCore_14/src/de/steamwar/core/FlatteningWrapper14.java index 5ed2b45..f5626d0 100644 --- a/SpigotCore_14/src/de/steamwar/core/FlatteningWrapper14.java +++ b/SpigotCore_14/src/de/steamwar/core/FlatteningWrapper14.java @@ -23,6 +23,7 @@ import com.comphenix.tinyprotocol.Reflection; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; +import org.bukkit.World; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -350,4 +351,11 @@ public class FlatteningWrapper14 implements FlatteningWrapper.IFlatteningWrapper public int getViewDistance(Player player) { return player.getClientViewDistance(); } + + private static final Reflection.MethodInvoker getHandle = Reflection.getMethod("{obc}.CraftWorld", "getHandle"); + private static final Reflection.MethodInvoker save = Reflection.getMethod("{nms.server.level}.WorldServer", null, Reflection.getClass("{nms.util}.IProgressUpdate"), boolean.class, boolean.class); + @Override + public void syncSave(World world) { + save.invoke(getHandle.invoke(world), null, true, false); + } } diff --git a/SpigotCore_8/src/de/steamwar/core/FlatteningWrapper8.java b/SpigotCore_8/src/de/steamwar/core/FlatteningWrapper8.java index 8df959b..535c526 100644 --- a/SpigotCore_8/src/de/steamwar/core/FlatteningWrapper8.java +++ b/SpigotCore_8/src/de/steamwar/core/FlatteningWrapper8.java @@ -21,6 +21,7 @@ package de.steamwar.core; import com.comphenix.tinyprotocol.Reflection; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -111,4 +112,10 @@ public class FlatteningWrapper8 implements FlatteningWrapper.IFlatteningWrapper public int getViewDistance(Player player) { return 10; } + + private static final Reflection.MethodInvoker save = Reflection.getMethod("{obc}.CraftWorld", "save", boolean.class); + @Override + public void syncSave(World world) { + save.invoke(world, true); + } } diff --git a/SpigotCore_Main/src/de/steamwar/core/CheckpointUtils.java b/SpigotCore_Main/src/de/steamwar/core/CheckpointUtils.java index 44deb79..15d063a 100644 --- a/SpigotCore_Main/src/de/steamwar/core/CheckpointUtils.java +++ b/SpigotCore_Main/src/de/steamwar/core/CheckpointUtils.java @@ -25,17 +25,17 @@ import com.viaversion.viaversion.api.Via; import de.steamwar.sql.internal.Statement; import io.netty.channel.ChannelFuture; import org.bukkit.Bukkit; -import org.bukkit.Chunk; import org.eclipse.openj9.criu.CRIUSupport; import org.eclipse.openj9.criu.JVMCRIUException; import sun.misc.Signal; -import java.io.*; +import java.io.DataInputStream; +import java.io.File; +import java.io.IOException; import java.net.InetAddress; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.logging.Level; @@ -84,7 +84,7 @@ public class CheckpointUtils { private static final Reflection.FieldAccessor channelFutures = Reflection.getField(TinyProtocol.serverConnection, List.class, 0, ChannelFuture.class); private static final Reflection.MethodInvoker bind = Reflection.getMethod(TinyProtocol.serverConnection, null, InetAddress.class, int.class); private static void freezeInternal(Path path) throws Exception { - Bukkit.getWorlds().forEach(world -> Arrays.stream(world.getLoadedChunks()).forEach(Chunk::unload)); + Bukkit.getWorlds().forEach(FlatteningWrapper.impl::syncSave); Statement.closeAll(); // Close socket @@ -96,6 +96,9 @@ public class CheckpointUtils { } channels.clear(); + System.runFinalization(); + System.gc(); + // Do the checkpoint path.toFile().mkdirs(); CRIUSupport criu = new CRIUSupport(path); diff --git a/SpigotCore_Main/src/de/steamwar/core/FlatteningWrapper.java b/SpigotCore_Main/src/de/steamwar/core/FlatteningWrapper.java index 12423ae..479760c 100644 --- a/SpigotCore_Main/src/de/steamwar/core/FlatteningWrapper.java +++ b/SpigotCore_Main/src/de/steamwar/core/FlatteningWrapper.java @@ -21,6 +21,7 @@ package de.steamwar.core; import com.comphenix.tinyprotocol.Reflection; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -48,6 +49,8 @@ public class FlatteningWrapper { void setSpawnPacketType(Object packet, EntityType type); int getViewDistance(Player player); + + void syncSave(World world); } public enum EntityPose {