diff --git a/BauSystem_15/src/de/steamwar/bausystem/region/Region_15.java b/BauSystem_15/src/de/steamwar/bausystem/region/Region_15.java
index f9a1e19e..3e7ca830 100644
--- a/BauSystem_15/src/de/steamwar/bausystem/region/Region_15.java
+++ b/BauSystem_15/src/de/steamwar/bausystem/region/Region_15.java
@@ -23,9 +23,13 @@ import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.bukkit.BukkitWorld;
+import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
+import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader;
+import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter;
+import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.transform.AffineTransform;
@@ -36,8 +40,10 @@ import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Objects;
+import java.util.logging.Level;
import lombok.experimental.UtilityClass;
import org.bukkit.Bukkit;
@@ -98,4 +104,28 @@ public class Region_15 {
}
}
}
+
+ boolean backup(Point minPoint, Point maxPoint, File file) {
+ BukkitWorld bukkitWorld = new BukkitWorld(Bukkit.getWorlds().get(0));
+ CuboidRegion region = new CuboidRegion(bukkitWorld, RegionUtils_15.toBlockVector3(minPoint), RegionUtils_15.toBlockVector3(maxPoint));
+ BlockArrayClipboard clipboard = new BlockArrayClipboard(region);
+ try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(bukkitWorld, -1)) {
+ ForwardExtentCopy copy = new ForwardExtentCopy(
+ e, region, clipboard, region.getMinimumPoint()
+ );
+
+ copy.setCopyingEntities(false);
+ copy.setCopyingBiomes(false);
+
+ Operations.complete(copy);
+
+ try (ClipboardWriter writer = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(file))) {
+ writer.write(clipboard);
+ }
+ return true;
+ } catch (WorldEditException | IOException e) {
+ Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
+ return false;
+ }
+ }
}
\ No newline at end of file
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/region/BackupScheduler.java b/BauSystem_Main/src/de/steamwar/bausystem/region/BackupScheduler.java
new file mode 100644
index 00000000..432f156d
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/region/BackupScheduler.java
@@ -0,0 +1,61 @@
+/*
+ * This file is a part of the SteamWar software.
+ *
+ * Copyright (C) 2021 SteamWar.de-Serverteam
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package de.steamwar.bausystem.region;
+
+import de.steamwar.bausystem.BauSystem;
+import de.steamwar.bausystem.linkage.Enable;
+import de.steamwar.bausystem.linkage.LinkageType;
+import de.steamwar.bausystem.linkage.Linked;
+import de.steamwar.bausystem.region.tags.Tag;
+import java.util.Iterator;
+import org.bukkit.scheduler.BukkitRunnable;
+
+
+@Linked(LinkageType.ENABLE_LINK)
+public class BackupScheduler implements Enable {
+
+ @Override
+ public void enable() {
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ final Iterator regions = Region.getREGION_MAP().values().stream().filter(region -> region.get(Tag.CHANGED)).iterator();
+ BackupScheduler.this.doBackup(regions);
+ }
+ }.runTaskTimer(BauSystem.getInstance(), 0, 20*60*30);
+ }
+
+ public void doBackup(final Iterator regionIterator) {
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ if (!regionIterator.hasNext()) {
+ this.cancel();
+ return;
+ }
+
+ final Region region = regionIterator.next();
+ if (region.backup()) {
+ region.remove(Tag.CHANGED);
+ }
+ }
+ }.runTaskTimer(BauSystem.getInstance(), 0, 20);
+ }
+}
\ No newline at end of file
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java b/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java
index 5bce6af0..70956ff5 100644
--- a/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java
+++ b/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java
@@ -27,10 +27,14 @@ import de.steamwar.bausystem.region.tags.Tag;
import de.steamwar.bausystem.region.utils.RegionExtensionType;
import de.steamwar.bausystem.region.utils.RegionType;
import de.steamwar.bausystem.shared.SizedStack;
+import de.steamwar.core.VersionedCallable;
import de.steamwar.sql.Schematic;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NonNull;
+import org.bukkit.Bukkit;
import org.bukkit.Location;
import yapion.hierarchy.types.YAPIONObject;
import yapion.hierarchy.types.YAPIONType;
@@ -50,7 +54,10 @@ import static de.steamwar.bausystem.region.RegionUtils.paste;
@Getter
public class Region {
+ @Getter
private static final Map REGION_MAP = new HashMap<>();
+ private static final File backupFolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "backup");
+ private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH-mm-ss'#'dd-MM-yyyy");
public static Region getRegion(Location location) {
return REGION_MAP.values().stream()
@@ -289,10 +296,20 @@ public class Region {
setLinkedRegion(region -> region.flagStorage.set(tag));
}
+ public void remove(Tag tag) {
+ if (flagStorage.remove(tag)) {
+ RegionUtils.save(this);
+ }
+ }
+
public Flag.Value> get(Flag flagType) {
return flagStorage.get(flagType);
}
+ public boolean get(Tag tagType) {
+ return flagStorage.is(tagType);
+ }
+
public & Flag.Value> T getPlain(Flag flagType) {
return (T) flagStorage.get(flagType).getValue();
}
@@ -448,4 +465,12 @@ public class Region {
}
}
+ public boolean backup() {
+ final File definedBackupFolder = new File(new File(backupFolder, prototype.getName()), name);
+ //noinspection ResultOfMethodCallIgnored
+ definedBackupFolder.mkdirs();
+ final File backupFile = new File(definedBackupFolder, LocalDateTime.now().format(formatter) + ".schem");
+ //noinspection unchecked
+ return VersionedCallable.call(new VersionedCallable<>(() -> Region_15.backup(minPoint, maxPoint, backupFile), 15));
+ }
}
\ No newline at end of file