From ef3d1b3c95188957909e05d833e7e0a9b62157dc Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 25 Mar 2026 09:00:41 +0100 Subject: [PATCH] Improve reading/writing Regions Improve DynamicRegion constructors --- .../meta.json | 5 +- .../region/DynamicRegionVisualizer.java | 2 +- .../region/dynamic/DynamicRegion.java | 41 ++++++++--- .../dynamic/DynamicRegionRepository.java | 69 +++++++++++-------- .../bausystem/region/dynamic/TileUtils.java | 62 +++++++++++++++++ .../region/dynamic/VariantSelector.java | 22 +++--- .../region/dynamic/modes/AreaBlock.java | 2 +- .../region/dynamic/modes/AreaTile.java | 13 ++-- .../dynamic/modes/PlotRegionBackups.java | 6 +- .../microwargear_7/MiWG7DisplayRegion.java | 28 ++++++-- .../modes/microwargear_7/MiWG7PlotRegion.java | 26 +++++-- .../modes/miniwargear/MWGDisplayRegion.java | 28 ++++++-- .../modes/miniwargear/MWGPlotRegion.java | 30 ++++++-- .../modes/wargear_45/WG45DisplayRegion.java | 28 ++++++-- .../modes/wargear_45/WG45PlotRegion.java | 28 ++++++-- .../modes/warship_175/WS175DisplayRegion.java | 28 ++++++-- .../modes/warship_175/WS175PlotRegion.java | 26 +++++-- .../modes/warship_230/WS230DisplayRegion.java | 28 ++++++-- .../modes/warship_230/WS230PlotRegion.java | 26 +++++-- .../region/dynamic/path/PathArea.java | 13 ++-- .../region/dynamic/path/PathRegion.java | 25 +++++-- .../region/dynamic/special/SpecialArea.java | 7 +- .../region/dynamic/special/dry/DryRegion.java | 26 +++++-- .../region/dynamic/special/wet/WetRegion.java | 25 +++++-- 24 files changed, 449 insertions(+), 145 deletions(-) create mode 100644 BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/TileUtils.java diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/00000000-0000-0000-0000-000000000000/meta.json b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/00000000-0000-0000-0000-000000000000/meta.json index 70c78272..04ea5b03 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/00000000-0000-0000-0000-000000000000/meta.json +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/00000000-0000-0000-0000-000000000000/meta.json @@ -1,5 +1,6 @@ { "region_identifier": "SpawnRegion", - "tile_x": 0, - "tile_z": 0 + "tiles": [ + { "tile_x": 0, "tile_z": 0 } + ] } \ No newline at end of file diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionVisualizer.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionVisualizer.java index 87d5e1d6..160e1a0b 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionVisualizer.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionVisualizer.java @@ -306,7 +306,7 @@ public class DynamicRegionVisualizer implements SWPlayer.Component, Listener { } private void place() { - DynamicRegion dynamicRegion = DynamicRegionRepository.constructRegion(regionType, UUID.randomUUID(), sourceTile.getMinX(), sourceTile.getMinZ()); + DynamicRegion dynamicRegion = DynamicRegionRepository.constructRegion(regionType, sourceTile); if (dynamicRegion == null) { // TODO: Give error to user return; diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegion.java index 563a0285..2141e74b 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegion.java @@ -19,6 +19,8 @@ package de.steamwar.bausystem.region.dynamic; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.DynamicRegionSystem; import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Region; @@ -28,6 +30,7 @@ import de.steamwar.bausystem.shared.Pair; import lombok.Getter; import lombok.NonNull; +import java.io.IOException; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -36,26 +39,46 @@ import java.util.UUID; public abstract class DynamicRegion implements Region { protected final UUID id; - protected final int minX; - protected final int minZ; @Getter protected RegionData regionData = null; - protected DynamicRegion(UUID id, int minX, int minZ) { - this.id = id; - this.minX = minX; - this.minZ = minZ; + /** + * This Constructor should be used if a Region is placed newly onto the world! + * + * @param tile this parameter is never used but forces the implementor to have it as a parameter + */ + protected DynamicRegion(Tile tile) { + this.id = UUID.randomUUID(); } /** - * This method must be called from the super constructor in a way that everything is already initialized. + * This constructor is used for loading the Region from a file + * + * @param id + * @param tileData this parameter is never used but forces the implementor to have it as a parameter */ - protected final void finishInit() { - DynamicRegionSystem.INSTANCE.add(this); + protected DynamicRegion(UUID id, JsonArray tileData) { + this.id = id; + } + + /** + * This method should be called when a Region is created and needs to be saved afterward + */ + protected final void finishCreate() { + finishLoad(); save(); } + /** + * This method should be called when a Region is loaded from file! + */ + protected final void finishLoad() { + DynamicRegionSystem.INSTANCE.add(this); + } + + public abstract void writeTileData(JsonWriter writer) throws IOException; + public final void updateNeighbours() { List> list = DynamicRegionSystem.INSTANCE.getNeighbours(this) .filter(data -> data.getKey() instanceof PathRegion) diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegionRepository.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegionRepository.java index eba78ae7..a17af251 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegionRepository.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegionRepository.java @@ -19,10 +19,7 @@ package de.steamwar.bausystem.region.dynamic; -import com.google.gson.JsonIOException; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.JsonSyntaxException; +import com.google.gson.*; import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.*; import de.steamwar.bausystem.region.dynamic.path.PathRegion; @@ -31,7 +28,6 @@ import lombok.Cleanup; import lombok.SneakyThrows; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; -import org.bukkit.Location; import java.io.*; import java.lang.reflect.Constructor; @@ -71,8 +67,11 @@ public class DynamicRegionRepository { public static final String META_FILE_NAME = "meta.json"; public static final String META_FILE_REGION_IDENTIFIER = "region_identifier"; - public static final String META_FILE_TILE_X = "tile_x"; - public static final String META_FILE_TILE_Z = "tile_z"; + @Deprecated + private static final String META_FILE_TILE_X = "tile_x"; + @Deprecated + private static final String META_FILE_TILE_Z = "tile_z"; + public static final String META_FILES_TILES = "tiles"; public static final String FLAG_FILE_NAME = "flags.json"; public static final String BACKUPS_DIR_NAME = "backups"; @@ -119,12 +118,8 @@ public class DynamicRegionRepository { continue; } - int tileX; - int tileZ; String identifier; try { - tileX = metaData.getAsJsonPrimitive(META_FILE_TILE_X).getAsInt(); - tileZ = metaData.getAsJsonPrimitive(META_FILE_TILE_Z).getAsInt(); identifier = metaData.getAsJsonPrimitive(META_FILE_REGION_IDENTIFIER).getAsString(); } catch (ClassCastException | NumberFormatException e) { RegionSystem.LOGGER.log(Level.SEVERE, "Failed to read region metadata file (invalid json)"); @@ -138,13 +133,12 @@ public class DynamicRegionRepository { continue; } - Tile tile = Tile.fromTile(tileX, tileZ).orElse(null); - if (tile == null) { + JsonArray tileData = metaData.getAsJsonArray(META_FILES_TILES); + if (tileData == null) { RegionSystem.LOGGER.log(Level.SEVERE, "Failed to read region metadata file (tile is no longer in bounds)"); continue; } - Location minTileLocation = tile.getMinLocation(); - constructRegion(regionClass, regionUUID, minTileLocation.getBlockX(), minTileLocation.getBlockZ()); + constructRegion(regionClass, regionUUID, tileData); } // Calculate Garden State for all PathRegions @@ -154,17 +148,35 @@ public class DynamicRegionRepository { }); } - public static DynamicRegion constructRegion(Class clazz, UUID uuid, int minX, int minZ) { + public static DynamicRegion constructRegion(Class clazz, Tile tile) { Constructor regionConstructor; try { - regionConstructor = clazz.getConstructor(UUID.class, int.class, int.class); + regionConstructor = clazz.getConstructor(Tile.class); + } catch (NoSuchMethodException e) { + RegionSystem.LOGGER.log(Level.SEVERE, "Failed to create region (region constructor not found)"); + return null; + } + + try { + return regionConstructor.newInstance(tile); + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | + InvocationTargetException e) { + RegionSystem.LOGGER.log(Level.SEVERE, "Failed to create region (invalid data)"); + return null; + } + } + + public static DynamicRegion constructRegion(Class clazz, UUID uuid, JsonArray tileData) { + Constructor regionConstructor; + try { + regionConstructor = clazz.getConstructor(UUID.class, JsonArray.class); } catch (NoSuchMethodException e) { RegionSystem.LOGGER.log(Level.SEVERE, "Failed to read region metadata file (region constructor not found)"); return null; } try { - return regionConstructor.newInstance(uuid, minX, minZ); + return regionConstructor.newInstance(uuid, tileData); } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { RegionSystem.LOGGER.log(Level.SEVERE, "Failed to read region metadata file (invalid data)"); @@ -236,17 +248,18 @@ public class DynamicRegionRepository { } public static void saveRegion(Region region) { + if (!(region.getType().isGlobal() || region instanceof DynamicRegion)) { + throw new IllegalArgumentException(); + } + File regionDirectory = new File(REGION_DATA_FOLDER, region.getID().toString()); if (!regionDirectory.exists()) { regionDirectory.mkdir(); } - if (!region.getType().isGlobal()) { + if (region instanceof DynamicRegion dynamicRegion) { RegionConstructorData constructorData = DynamicRegionSystem.constructorDataMap.get(region.getClass()); - Point point = region.getArea().getMinPoint(false); - Tile tile = Tile.fromPoint(point).get(); - - writeMetaFile(regionDirectory, constructorData, tile); + writeMetaFile(regionDirectory, constructorData, dynamicRegion); } writeFlagsFile(regionDirectory, region.getRegionData()); @@ -261,17 +274,17 @@ public class DynamicRegionRepository { } @SneakyThrows - private static void writeMetaFile(File regionDirectory, RegionConstructorData constructorData, Tile tile) { + private static void writeMetaFile(File regionDirectory, RegionConstructorData constructorData, DynamicRegion dynamicRegion) { @Cleanup JsonWriter jsonWriter = new JsonWriter(new FileWriter(new File(regionDirectory, META_FILE_NAME))); jsonWriter.setIndent(" "); jsonWriter.beginObject(); jsonWriter.name(META_FILE_REGION_IDENTIFIER); jsonWriter.value(constructorData.identifier()); - jsonWriter.name(META_FILE_TILE_X); - jsonWriter.value(tile.getTileX()); - jsonWriter.name(META_FILE_TILE_Z); - jsonWriter.value(tile.getTileZ()); + jsonWriter.name(META_FILES_TILES); + jsonWriter.beginArray(); + dynamicRegion.writeTileData(jsonWriter); + jsonWriter.endArray(); jsonWriter.endObject(); } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/TileUtils.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/TileUtils.java new file mode 100644 index 00000000..7dd26de0 --- /dev/null +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/TileUtils.java @@ -0,0 +1,62 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2026 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.dynamic; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import com.google.gson.stream.JsonWriter; +import lombok.experimental.UtilityClass; + +import java.io.IOException; + +@UtilityClass +public class TileUtils { + + private static Tile readTile(JsonObject tileData, String prefix) { + JsonPrimitive xData = tileData.getAsJsonPrimitive(prefix + "_x"); + JsonPrimitive zData = tileData.getAsJsonPrimitive(prefix + "_z"); + if (xData == null || zData == null) return null; + return Tile.fromTile(xData.getAsInt(), zData.getAsInt()) + .orElse(null); + } + + public static Tile readTile(JsonArray tileData) { + if (tileData.size() != 1) return null; + try { + return readTile(tileData.get(0).getAsJsonObject(), "tile"); + } catch (IllegalStateException e) { + return null; + } + } + + private static void writeTile(JsonWriter writer, Tile tile, String prefix) throws IOException { + writer.name(prefix + "_x"); + writer.value(tile.getTileX()); + writer.name(prefix + "_z"); + writer.value(tile.getTileZ()); + } + + public static void writeTile(JsonWriter writer, Tile tile) throws IOException { + writer.beginObject(); + writeTile(writer, tile, "tile"); + writer.endObject(); + } +} diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/VariantSelector.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/VariantSelector.java index 63c1b720..90956ffb 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/VariantSelector.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/VariantSelector.java @@ -24,14 +24,17 @@ import lombok.NonNull; import java.io.File; import java.time.LocalDate; import java.time.Month; -import java.util.*; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Optional; +import java.util.Random; public abstract class VariantSelector { private static final Random RANDOM = new Random(); public static final VariantSelector EMPTY = new VariantSelector() { @Override - public Optional select(UUID regionID, int drift) { + public Optional select() { return Optional.empty(); } }; @@ -39,15 +42,15 @@ public abstract class VariantSelector { private VariantSelector() { } - public abstract Optional select(UUID regionID, int drift); + public abstract Optional select(); public final VariantSelector or(VariantSelector other) { if (this == EMPTY) return other; VariantSelector self = this; return new VariantSelector() { @Override - public Optional select(UUID regionID, int drift) { - return self.select(regionID, drift).or(() -> other.select(regionID, drift)); + public Optional select() { + return self.select().or(() -> other.select()); } }; } @@ -57,10 +60,10 @@ public abstract class VariantSelector { VariantSelector self = this; return new VariantSelector() { @Override - public Optional select(UUID regionID, int drift) { + public Optional select() { LocalDate date = LocalDate.now(); if (date.getDayOfMonth() == day && date.getMonth() == month) { - return self.select(regionID, drift); + return self.select(); } else { return Optional.empty(); } @@ -75,7 +78,7 @@ public abstract class VariantSelector { final File file = files[0]; return new VariantSelector() { @Override - public Optional select(UUID regionID, int drift) { + public Optional select() { return Optional.of(file); } }; @@ -85,8 +88,7 @@ public abstract class VariantSelector { final int filesCount = files.length; return new VariantSelector() { @Override - public Optional select(UUID regionID, int drift) { - RANDOM.setSeed(regionID.getLeastSignificantBits() ^ regionID.getMostSignificantBits() ^ drift); + public Optional select() { return Optional.of(files[RANDOM.nextInt(filesCount)]); } }; diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaBlock.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaBlock.java index 5fdd5abf..d6a3f75a 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaBlock.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaBlock.java @@ -162,7 +162,7 @@ public class AreaBlock implements Region.Area { @Override public void place(PasteBuilder pasteBuilder, boolean extension) { EditSession editSession = pasteBuilder - .with(PasteBuilder.ClipboardProvider.file(selector.select(region.getID(), 0).orElse(null))) + .with(PasteBuilder.ClipboardProvider.file(selector.select().orElse(null))) .pastePoint(copyPoint) .run(); region.getHistory() diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaTile.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaTile.java index d8119341..5b4e954e 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaTile.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaTile.java @@ -25,23 +25,22 @@ import de.steamwar.bausystem.region.dynamic.PasteUtils; import de.steamwar.bausystem.region.dynamic.Tile; import de.steamwar.bausystem.region.dynamic.VariantSelector; import de.steamwar.bausystem.utils.PasteBuilder; +import lombok.Getter; import lombok.NonNull; -import org.bukkit.Location; -import org.jetbrains.annotations.Nullable; import java.io.File; -import java.util.UUID; public class AreaTile implements Region.Area { - private final UUID regionIdentifier; + @Getter + private final Tile tile; private final Point minPoint; private final Point maxPoint; private final Point copyPoint; private final VariantSelector selector; - public AreaTile(Tile tile, int tileX, int tileZ, Region region, VariantSelector selector) { - regionIdentifier = region.getID(); + public AreaTile(Tile tile, int tileX, int tileZ, VariantSelector selector) { + this.tile = tile; minPoint = Point.fromLocation(tile.getMinLocation()).setY(WORLD_MIN_Y); maxPoint = Point.fromLocation(tile.add(tileX - 1, tileZ - 1).orElseThrow().getMaxLocation()).setY(WORLD_MAX_Y); int x = minPoint.getX() + (maxPoint.getX() - minPoint.getX()) / 2; @@ -67,7 +66,7 @@ public class AreaTile implements Region.Area { @Override public void place(PasteBuilder pasteBuilder, boolean extension) { - File resetFile = selector.select(regionIdentifier, 0).orElse(null); + File resetFile = selector.select().orElse(null); if (resetFile != null) PasteUtils.paste(resetFile, minPoint, 0); } } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/PlotRegionBackups.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/PlotRegionBackups.java index 5df0bfa1..b510f4f0 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/PlotRegionBackups.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/PlotRegionBackups.java @@ -104,8 +104,6 @@ public class PlotRegionBackups implements RegionBackups { private final class BackupImpl extends Backup { - private static final String SCHEM_FILE = "backup.schem"; - private final DynamicRegion region; public BackupImpl(@NonNull BackupType type, DynamicRegion region) { @@ -118,7 +116,7 @@ public class PlotRegionBackups implements RegionBackups { DynamicRegionRepository.saveBackup(region, this); Clipboard clipboard = region.getArea().copy(false); - try (ClipboardWriter writer = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(new File(backupDirectory, SCHEM_FILE)))) { + try (ClipboardWriter writer = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(new File(backupDirectory, DynamicRegionRepository.BACKUP_FILE_NAME)))) { writer.write(clipboard); } catch (IOException e) { Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e); @@ -133,7 +131,7 @@ public class PlotRegionBackups implements RegionBackups { @Override public boolean load() { - File file = new File(DynamicRegionRepository.getBackupDirectory(region, this), SCHEM_FILE); + File file = new File(DynamicRegionRepository.getBackupDirectory(region, this), DynamicRegionRepository.BACKUP_FILE_NAME); if (!file.exists()) return false; EditSession editSession = PasteUtils.paste(file, region.getArea().getMinPoint(false), 0); if (editSession == null) return false; diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/microwargear_7/MiWG7DisplayRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/microwargear_7/MiWG7DisplayRegion.java index 60c5fb88..9fb0c9fa 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/microwargear_7/MiWG7DisplayRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/microwargear_7/MiWG7DisplayRegion.java @@ -19,6 +19,8 @@ package de.steamwar.bausystem.region.dynamic.modes.microwargear_7; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.RegionBackups; import de.steamwar.bausystem.region.RegionData; import de.steamwar.bausystem.region.RegionHistory; @@ -32,6 +34,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import java.io.File; +import java.io.IOException; import java.util.UUID; @RegionConstructorData( @@ -49,14 +52,27 @@ public class MiWG7DisplayRegion extends DynamicRegion { private static final File DIRECTORY = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/microwargear_7/display"); private static final VariantSelector SELECTOR = VariantSelector.Get(DIRECTORY); - private final Area area; + private final AreaTile area; - public MiWG7DisplayRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - Tile tile = Tile.fromXZ(minX, minZ).orElseThrow(); - area = new AreaTile(tile, 1, 1, this, SELECTOR); + public MiWG7DisplayRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public MiWG7DisplayRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private MiWG7DisplayRegion(UUID id, Tile tile) { + super(id, null); + area = new AreaTile(tile, TILE_X, TILE_Z, SELECTOR); regionData = new DisplayRegionData(this); - finishInit(); + } + + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, area.getTile()); } @Override diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/microwargear_7/MiWG7PlotRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/microwargear_7/MiWG7PlotRegion.java index d9f49ba4..4f698d6c 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/microwargear_7/MiWG7PlotRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/microwargear_7/MiWG7PlotRegion.java @@ -19,6 +19,8 @@ package de.steamwar.bausystem.region.dynamic.modes.microwargear_7; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.*; import de.steamwar.bausystem.region.dynamic.*; import de.steamwar.bausystem.region.dynamic.modes.AreaBlock; @@ -33,6 +35,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import java.io.File; +import java.io.IOException; import java.util.UUID; @RegionConstructorData( @@ -58,10 +61,19 @@ public class MiWG7PlotRegion extends DynamicRegion { private final RegionHistory history; private final RegionBackups backups; - public MiWG7PlotRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - Tile tile = Tile.fromXZ(minX, minZ).orElseThrow(); - area = new AreaTile(tile, TILE_X, TILE_Z, this, REGION); + public MiWG7PlotRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public MiWG7PlotRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private MiWG7PlotRegion(UUID id, Tile tile) { + super(id, null); + area = new AreaTile(tile, TILE_X, TILE_Z, REGION); Pair pair = AreaBlock.create(this, 36, new Point(7, 7, 7), new Point(7, 0, 7), new Point(7, 7, 7), AreaBlock.CopyLocation.CENTER, 50); northArea = pair.getKey(); @@ -70,7 +82,11 @@ public class MiWG7PlotRegion extends DynamicRegion { regionData = new PlotRegionData(this); history = new RegionHistory.Impl(10); backups = new PlotRegionBackups(this, PlotRegionData::new); - finishInit(); + } + + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, area.getTile()); } @Override diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/miniwargear/MWGDisplayRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/miniwargear/MWGDisplayRegion.java index 6db37b59..707f7e5a 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/miniwargear/MWGDisplayRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/miniwargear/MWGDisplayRegion.java @@ -19,6 +19,8 @@ package de.steamwar.bausystem.region.dynamic.modes.miniwargear; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.RegionBackups; import de.steamwar.bausystem.region.RegionData; import de.steamwar.bausystem.region.RegionHistory; @@ -32,6 +34,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import java.io.File; +import java.io.IOException; import java.util.UUID; @RegionConstructorData( @@ -49,14 +52,27 @@ public class MWGDisplayRegion extends DynamicRegion { private static final File DIRECTORY = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/miniwargear/display"); private static final VariantSelector SELECTOR = VariantSelector.Get(DIRECTORY); - private final Area area; + private final AreaTile area; - public MWGDisplayRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - Tile tile = Tile.fromXZ(minX, minZ).orElseThrow(); - area = new AreaTile(tile, TILE_X, TILE_Z, this, SELECTOR); + public MWGDisplayRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public MWGDisplayRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private MWGDisplayRegion(UUID id, Tile tile) { + super(id, null); + area = new AreaTile(tile, TILE_X, TILE_Z, SELECTOR); regionData = new DisplayRegionData(this); - finishInit(); + } + + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, area.getTile()); } @Override diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/miniwargear/MWGPlotRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/miniwargear/MWGPlotRegion.java index e2989dc2..f581bd8e 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/miniwargear/MWGPlotRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/miniwargear/MWGPlotRegion.java @@ -19,6 +19,8 @@ package de.steamwar.bausystem.region.dynamic.modes.miniwargear; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.*; import de.steamwar.bausystem.region.dynamic.*; import de.steamwar.bausystem.region.dynamic.modes.AreaBlock; @@ -33,6 +35,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import java.io.File; +import java.io.IOException; import java.util.UUID; @RegionConstructorData( @@ -58,19 +61,32 @@ public class MWGPlotRegion extends DynamicRegion { private final RegionHistory history; private final RegionBackups backups; - public MWGPlotRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - history = new RegionHistory.Impl(10); - backups = new PlotRegionBackups(this, PlotRegionData::new); - Tile tile = Tile.fromXZ(minX, minZ).orElseThrow(); - area = new AreaTile(tile, TILE_X, TILE_Z, this, REGION); + public MWGPlotRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public MWGPlotRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private MWGPlotRegion(UUID id, Tile tile) { + super(id, null); + area = new AreaTile(tile, TILE_X, TILE_Z, REGION); Pair pair = AreaBlock.create(this, 36, new Point(37, 26, 22), new Point(7, 0, 7), new Point(7, 7, 7), AreaBlock.CopyLocation.CENTER, 50); northArea = pair.getKey(); southArea = pair.getValue(); regionData = new PlotRegionData(this); - finishInit(); + history = new RegionHistory.Impl(10); + backups = new PlotRegionBackups(this, PlotRegionData::new); + } + + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, area.getTile()); } @Override diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/wargear_45/WG45DisplayRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/wargear_45/WG45DisplayRegion.java index c069b642..06d13033 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/wargear_45/WG45DisplayRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/wargear_45/WG45DisplayRegion.java @@ -19,6 +19,8 @@ package de.steamwar.bausystem.region.dynamic.modes.wargear_45; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.RegionBackups; import de.steamwar.bausystem.region.RegionData; import de.steamwar.bausystem.region.RegionHistory; @@ -32,6 +34,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import java.io.File; +import java.io.IOException; import java.util.UUID; @RegionConstructorData( @@ -49,14 +52,27 @@ public class WG45DisplayRegion extends DynamicRegion { private static final File DIRECTORY = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/wargear_45/display"); private static final VariantSelector SELECTOR = VariantSelector.Get(DIRECTORY); - private final Area area; + private final AreaTile area; - public WG45DisplayRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - Tile tile = Tile.fromXZ(minX, minZ).orElseThrow(); - area = new AreaTile(tile, TILE_X, TILE_Z, this, SELECTOR); + public WG45DisplayRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public WG45DisplayRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private WG45DisplayRegion(UUID id, Tile tile) { + super(id, null); + area = new AreaTile(tile, TILE_X, TILE_Z, SELECTOR); regionData = new DisplayRegionData(this); - finishInit(); + } + + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, area.getTile()); } @Override diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/wargear_45/WG45PlotRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/wargear_45/WG45PlotRegion.java index da663d7e..164018a6 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/wargear_45/WG45PlotRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/wargear_45/WG45PlotRegion.java @@ -19,14 +19,14 @@ package de.steamwar.bausystem.region.dynamic.modes.wargear_45; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.*; import de.steamwar.bausystem.region.dynamic.*; import de.steamwar.bausystem.region.dynamic.modes.AreaBlock; import de.steamwar.bausystem.region.dynamic.modes.AreaTile; import de.steamwar.bausystem.region.dynamic.modes.PlotRegionBackups; import de.steamwar.bausystem.region.dynamic.modes.PlotRegionData; -import de.steamwar.bausystem.region.dynamic.modes.miniwargear.MWGUtils; -import de.steamwar.bausystem.region.dynamic.modes.warship_230.WS230Utils; import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.bausystem.shared.Pair; import de.steamwar.sql.GameModeConfig; @@ -35,6 +35,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import java.io.File; +import java.io.IOException; import java.util.UUID; @RegionConstructorData( @@ -60,10 +61,19 @@ public class WG45PlotRegion extends DynamicRegion { private final RegionHistory history; private final RegionBackups backups; - public WG45PlotRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - Tile tile = Tile.fromXZ(minX, minZ).orElseThrow(); - area = new AreaTile(tile, TILE_X, TILE_Z, this, REGION); + public WG45PlotRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public WG45PlotRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private WG45PlotRegion(UUID id, Tile tile) { + super(id, null); + area = new AreaTile(tile, TILE_X, TILE_Z, REGION); Pair pair = AreaBlock.create(this, 36, new Point(67, 41, 47), new Point(16, 0, 16), new Point(16, 16, 16), AreaBlock.CopyLocation.CENTER, 50); northArea = pair.getKey(); @@ -72,7 +82,11 @@ public class WG45PlotRegion extends DynamicRegion { regionData = new PlotRegionData(this); history = new RegionHistory.Impl(10); backups = new PlotRegionBackups(this, PlotRegionData::new); - finishInit(); + } + + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, area.getTile()); } @Override diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_175/WS175DisplayRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_175/WS175DisplayRegion.java index 278ea41c..a5726290 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_175/WS175DisplayRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_175/WS175DisplayRegion.java @@ -19,6 +19,8 @@ package de.steamwar.bausystem.region.dynamic.modes.warship_175; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.RegionBackups; import de.steamwar.bausystem.region.RegionData; import de.steamwar.bausystem.region.RegionHistory; @@ -32,6 +34,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import java.io.File; +import java.io.IOException; import java.util.UUID; @RegionConstructorData( @@ -49,14 +52,27 @@ public class WS175DisplayRegion extends DynamicRegion { private static final File DIRECTORY = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/warship_175/display"); private static final VariantSelector SELECTOR = VariantSelector.Get(DIRECTORY); - private final Area area; + private final AreaTile area; - public WS175DisplayRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - Tile tile = Tile.fromXZ(minX, minZ).orElseThrow(); - area = new AreaTile(tile, TILE_X, TILE_Z, this, SELECTOR); + public WS175DisplayRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public WS175DisplayRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private WS175DisplayRegion(UUID id, Tile tile) { + super(id, null); + area = new AreaTile(tile, TILE_X, TILE_Z, SELECTOR); regionData = new DisplayRegionData(this); - finishInit(); + } + + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, area.getTile()); } @Override diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_175/WS175PlotRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_175/WS175PlotRegion.java index cb02bd35..7473006c 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_175/WS175PlotRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_175/WS175PlotRegion.java @@ -19,6 +19,8 @@ package de.steamwar.bausystem.region.dynamic.modes.warship_175; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.*; import de.steamwar.bausystem.region.dynamic.*; import de.steamwar.bausystem.region.dynamic.modes.AreaBlock; @@ -33,6 +35,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import java.io.File; +import java.io.IOException; import java.util.UUID; @RegionConstructorData( @@ -58,10 +61,19 @@ public class WS175PlotRegion extends DynamicRegion { private final RegionHistory history; private final RegionBackups backups; - public WS175PlotRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - Tile tile = Tile.fromXZ(minX, minZ).orElseThrow(); - area = new AreaTile(tile, TILE_X, TILE_Z, this, REGION); + public WS175PlotRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public WS175PlotRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private WS175PlotRegion(UUID id, Tile tile) { + super(id, null); + area = new AreaTile(tile, TILE_X, TILE_Z, REGION); Pair pair = AreaBlock.create(this, 25, new Point(175, 58, 39), new Point(12, 0, 8), new Point(12, 0, 8), AreaBlock.CopyLocation.SIDE, 132); northArea = pair.getKey(); @@ -70,7 +82,11 @@ public class WS175PlotRegion extends DynamicRegion { regionData = new PlotRegionData(this); history = new RegionHistory.Impl(10); backups = new PlotRegionBackups(this, PlotRegionData::new); - finishInit(); + } + + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, area.getTile()); } @Override diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_230/WS230DisplayRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_230/WS230DisplayRegion.java index f0e3f436..9596cb8f 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_230/WS230DisplayRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_230/WS230DisplayRegion.java @@ -19,6 +19,8 @@ package de.steamwar.bausystem.region.dynamic.modes.warship_230; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.RegionBackups; import de.steamwar.bausystem.region.RegionData; import de.steamwar.bausystem.region.RegionHistory; @@ -32,6 +34,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import java.io.File; +import java.io.IOException; import java.util.UUID; @RegionConstructorData( @@ -49,14 +52,27 @@ public class WS230DisplayRegion extends DynamicRegion { private static final File DIRECTORY = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/warship_230/display"); private static final VariantSelector SELECTOR = VariantSelector.Get(DIRECTORY); - private final Area area; + private final AreaTile area; - public WS230DisplayRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - Tile tile = Tile.fromXZ(minX, minZ).orElseThrow(); - area = new AreaTile(tile, TILE_X, TILE_Z, this, SELECTOR); + public WS230DisplayRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public WS230DisplayRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private WS230DisplayRegion(UUID id, Tile tile) { + super(id, null); + area = new AreaTile(tile, TILE_X, TILE_Z, SELECTOR); regionData = new DisplayRegionData(this); - finishInit(); + } + + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, area.getTile()); } @Override diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_230/WS230PlotRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_230/WS230PlotRegion.java index f6dc654b..76296145 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_230/WS230PlotRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/warship_230/WS230PlotRegion.java @@ -19,6 +19,8 @@ package de.steamwar.bausystem.region.dynamic.modes.warship_230; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.*; import de.steamwar.bausystem.region.dynamic.*; import de.steamwar.bausystem.region.dynamic.modes.AreaBlock; @@ -33,6 +35,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import java.io.File; +import java.io.IOException; import java.util.UUID; @RegionConstructorData( @@ -58,10 +61,19 @@ public class WS230PlotRegion extends DynamicRegion { private final RegionHistory history; private final RegionBackups backups; - public WS230PlotRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - Tile tile = Tile.fromXZ(minX, minZ).orElseThrow(); - area = new AreaTile(tile, TILE_X, TILE_Z, this, REGION); + public WS230PlotRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public WS230PlotRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private WS230PlotRegion(UUID id, Tile tile) { + super(id, null); + area = new AreaTile(tile, TILE_X, TILE_Z, REGION); Pair pair = AreaBlock.create(this, 25, new Point(230, 58, 43), new Point(12, 0, 8), new Point(12, 0, 8), AreaBlock.CopyLocation.SIDE, 136); northArea = pair.getKey(); @@ -70,7 +82,11 @@ public class WS230PlotRegion extends DynamicRegion { regionData = new PlotRegionData(this); history = new RegionHistory.Impl(10); backups = new PlotRegionBackups(this, PlotRegionData::new); - finishInit(); + } + + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, area.getTile()); } @Override diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathArea.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathArea.java index 8e25df4b..4ffac9a0 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathArea.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathArea.java @@ -37,7 +37,6 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.Optional; -import java.util.UUID; import java.util.function.BiConsumer; import static de.steamwar.bausystem.region.RegionType.ConnectionType.*; @@ -118,20 +117,16 @@ public class PathArea implements Region.Area { } private final PathRegion region; - private final UUID regionIdentifier; private final Tile tile; private final Point minPoint; private final Point maxPoint; - private final Point copyPoint; public PathArea(Tile tile, PathRegion region) { this.region = region; - this.regionIdentifier = region.getID(); this.tile = tile; minPoint = Point.fromLocation(tile.getMinLocation()).setY(WORLD_MIN_Y); maxPoint = Point.fromLocation(tile.getMaxLocation()).setY(WORLD_MAX_Y); - copyPoint = Point.fromLocation(tile.getCenterLocation()); } @Override @@ -177,7 +172,7 @@ public class PathArea implements Region.Area { public void reset(PathSide side) { File resetFile = null; VariantSelector selector = SELECTOR_SIDE.Select(tile, side); - if (selector != null) resetFile = selector.select(regionIdentifier, side.ordinal() + side.rotate).orElse(null); + if (selector != null) resetFile = selector.select().orElse(null); if (selector == null || resetFile == null) { if (!BauSystem.DEV_SERVER) return; resetFile = FALLBACK_SCHEM; @@ -191,7 +186,7 @@ public class PathArea implements Region.Area { Pair pair = SELECTOR_CORNER.Select(tile, corner); VariantSelector selector = pair.getKey(); RotationCorrection rotationCorrection = pair.getValue(); - if (selector != null) resetFile = selector.select(regionIdentifier, corner.side1.ordinal() * corner.side2.ordinal() + corner.side1.rotate * corner.side2.rotate).orElse(null); + if (selector != null) resetFile = selector.select().orElse(null); if (selector == null || resetFile == null) { if (!BauSystem.DEV_SERVER) return; resetFile = FALLBACK_SCHEM; @@ -216,14 +211,14 @@ public class PathArea implements Region.Area { @Override public void place(PasteBuilder pasteBuilder, boolean extension) { if (region.isGarden()) { - File resetFile = GARDEN.select(regionIdentifier, 0).orElse(null); + File resetFile = GARDEN.select().orElse(null); if (resetFile != null) { PasteUtils.paste(resetFile, minPoint, 0); } return; } - File resetFile = CENTER_NORMAL.select(regionIdentifier, 0).orElse(null); + File resetFile = CENTER_NORMAL.select().orElse(null); if (resetFile != null) { PasteUtils.paste(resetFile, minPoint.add(7, 0, 7), 0); } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathRegion.java index 7f9687ce..68756e3f 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathRegion.java @@ -19,6 +19,8 @@ package de.steamwar.bausystem.region.dynamic.path; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.*; import de.steamwar.bausystem.region.dynamic.*; import de.steamwar.sql.GameModeConfig; @@ -26,6 +28,7 @@ import lombok.Getter; import lombok.NonNull; import org.bukkit.Material; +import java.io.IOException; import java.util.UUID; @RegionConstructorData( @@ -41,15 +44,29 @@ public class PathRegion extends DynamicRegion { @Getter private final Tile tile; - public PathRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - tile = Tile.fromXZ(minX, minZ).orElseThrow(); + public PathRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public PathRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private PathRegion(UUID id, Tile tile) { + super(id, null); + this.tile = tile; area = new PathArea(tile, this); regionData = new PathRegionData(this); - finishInit(); calculateGardenState(); } + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, tile); + } + public void update(DynamicRegion updateFrom, NeighbourDirection direction) { for (PathSide side : direction.getSideUpdates()) { area.reset(side); diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialArea.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialArea.java index 0179b633..116c978a 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialArea.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialArea.java @@ -28,6 +28,7 @@ import de.steamwar.bausystem.region.dynamic.PasteUtils; import de.steamwar.bausystem.region.dynamic.Tile; import de.steamwar.bausystem.region.dynamic.VariantSelector; import de.steamwar.bausystem.utils.PasteBuilder; +import lombok.Getter; import lombok.NonNull; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -43,7 +44,8 @@ public class SpecialArea implements Region.Area { public static final File SPECIAL_PATH_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/special"); private final DynamicRegion region; - private final UUID regionIdentifier; + + @Getter private final Tile tile; private final Point minPoint; private final Point maxPoint; @@ -52,7 +54,6 @@ public class SpecialArea implements Region.Area { public SpecialArea(Tile tile, DynamicRegion region, VariantSelector resetFiles) { this.region = region; - this.regionIdentifier = region.getID(); this.tile = tile; minPoint = Point.fromLocation(tile.getMinLocation()).setY(WORLD_MIN_Y); @@ -105,7 +106,7 @@ public class SpecialArea implements Region.Area { @Override public void place(PasteBuilder pasteBuilder, boolean extension) { - File resetFile = resetFiles.select(regionIdentifier, 0).orElse(null); + File resetFile = resetFiles.select().orElse(null); if (resetFile != null) PasteUtils.paste(resetFile, minPoint, 0); resetting = false; } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/dry/DryRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/dry/DryRegion.java index 70843e36..470d5cce 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/dry/DryRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/dry/DryRegion.java @@ -19,11 +19,15 @@ package de.steamwar.bausystem.region.dynamic.special.dry; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.RegionBackups; import de.steamwar.bausystem.region.RegionData; import de.steamwar.bausystem.region.RegionHistory; import de.steamwar.bausystem.region.RegionType; import de.steamwar.bausystem.region.dynamic.*; +import de.steamwar.bausystem.region.dynamic.modes.AreaTile; +import de.steamwar.bausystem.region.dynamic.modes.DisplayRegionData; import de.steamwar.bausystem.region.dynamic.special.SpecialArea; import de.steamwar.bausystem.region.dynamic.special.SpecialRegionData; import de.steamwar.sql.GameModeConfig; @@ -31,6 +35,7 @@ import lombok.NonNull; import org.bukkit.Material; import java.io.File; +import java.io.IOException; import java.util.UUID; import static de.steamwar.bausystem.region.dynamic.special.SpecialArea.SPECIAL_PATH_DIR; @@ -48,12 +53,25 @@ public class DryRegion extends DynamicRegion { private final SpecialArea area; - public DryRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - Tile tile = Tile.fromXZ(minX, minZ).orElseThrow(); + public DryRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public DryRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private DryRegion(UUID id, Tile tile) { + super(id, null); area = new SpecialArea(tile, this, DRY); regionData = new SpecialRegionData(this); - finishInit(); + } + + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, area.getTile()); } @Override diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/wet/WetRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/wet/WetRegion.java index 70c031d2..183e7a57 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/wet/WetRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/wet/WetRegion.java @@ -19,17 +19,21 @@ package de.steamwar.bausystem.region.dynamic.special.wet; +import com.google.gson.JsonArray; +import com.google.gson.stream.JsonWriter; import de.steamwar.bausystem.region.RegionBackups; import de.steamwar.bausystem.region.RegionData; import de.steamwar.bausystem.region.RegionHistory; import de.steamwar.bausystem.region.RegionType; import de.steamwar.bausystem.region.dynamic.*; import de.steamwar.bausystem.region.dynamic.special.SpecialArea; +import de.steamwar.bausystem.region.dynamic.special.SpecialRegionData; import de.steamwar.sql.GameModeConfig; import lombok.NonNull; import org.bukkit.Material; import java.io.File; +import java.io.IOException; import java.util.UUID; import static de.steamwar.bausystem.region.dynamic.special.SpecialArea.SPECIAL_PATH_DIR; @@ -47,12 +51,25 @@ public class WetRegion extends DynamicRegion { private final SpecialArea area; - public WetRegion(UUID id, int minX, int minZ) { - super(id, minX, minZ); - Tile tile = Tile.fromXZ(minX, minZ).orElseThrow(); + public WetRegion(Tile tile) { + this(UUID.randomUUID(), tile); + finishCreate(); + } + + public WetRegion(UUID id, JsonArray tileData) { + this(id, TileUtils.readTile(tileData)); + finishLoad(); + } + + private WetRegion(UUID id, Tile tile) { + super(id, null); area = new SpecialArea(tile, this, WET); regionData = new WetRegionData(this); - finishInit(); + } + + @Override + public void writeTileData(JsonWriter writer) throws IOException { + TileUtils.writeTile(writer, area.getTile()); } @Override