From b6aa1447ae7e7b2d30c4abbcd50360684df1941e Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 6 Aug 2025 15:27:29 +0200 Subject: [PATCH] Add Display regions --- .../de/steamwar/bausystem/region/Region.java | 6 + .../region/DynamicRegionCommand.java | 20 ++- .../bausystem/region/DynamicRegionSystem.java | 45 +++++-- .../region/dynamic/DefaultFlagStorage.java | 5 +- .../region/dynamic/DynamicRegion.java | 11 +- .../region/dynamic/RegionDataRepository.java | 16 ++- .../region/dynamic/global/GlobalRegion.java | 3 +- .../region/dynamic/normal/DisplayRegion.java | 48 +++++++- .../region/dynamic/normal/NormalArea.java | 114 ++++++++++++------ .../region/dynamic/normal/WorkArea.java | 102 ---------------- .../region/dynamic/normal/WorkRegion.java | 10 +- .../display/MicroWarGear21DisplayRegion.java | 59 +++++++++ .../display/MiniWarGear21DisplayRegion.java | 59 +++++++++ .../display/WarGear21DisplayRegion.java | 59 +++++++++ .../display/WarShip21DisplayRegion.java | 59 +++++++++ .../normal/work/MicroWarGear21WorkRegion.java | 16 +-- .../normal/work/MiniWarGear21WorkRegion.java | 16 +-- .../normal/work/WarGear21WorkRegion.java | 16 +-- .../normal/work/WarShip21WorkRegion.java | 16 +-- .../region/dynamic/path/PathRegion.java | 7 +- .../region/dynamic/spawn/SpawnPathRegion.java | 7 +- .../region/dynamic/spawn/SpawnRegion.java | 7 +- .../dynamic/special/DrySpecialRegion.java | 33 ++++- .../dynamic/special/SpecialAreaTile.java | 57 ++++++++- .../dynamic/special/SpecialFlagStorage.java | 47 ++++++++ .../region/dynamic/special/SpecialRegion.java | 58 ++++++++- .../dynamic/special/WetSpecialRegion.java | 28 ++++- 27 files changed, 707 insertions(+), 217 deletions(-) delete mode 100644 BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/WorkArea.java create mode 100644 BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/MicroWarGear21DisplayRegion.java create mode 100644 BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/MiniWarGear21DisplayRegion.java create mode 100644 BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/WarGear21DisplayRegion.java create mode 100644 BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/WarShip21DisplayRegion.java create mode 100644 BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialFlagStorage.java diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java index 56b4b85e..84a4a7e1 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java @@ -65,6 +65,12 @@ public interface Region { @NonNull Area getTestblockArea(); + default int getFloorLevel() { + Point p1 = getBuildArea().getMinPoint(true); + Point p2 = getTestblockArea().getMinPoint(true); + return Math.min(p1.getY(), p2.getY()); + } + @NonNull GameModeConfig getGameModeConfig(); diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionCommand.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionCommand.java index f23c2e1d..01693888 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionCommand.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionCommand.java @@ -22,11 +22,17 @@ package de.steamwar.bausystem.region; import de.steamwar.bausystem.features.region.RegionCommand; import de.steamwar.bausystem.region.dynamic.DynamicRegion; import de.steamwar.bausystem.region.dynamic.TileUtils; +import de.steamwar.bausystem.region.dynamic.normal.display.MicroWarGear21DisplayRegion; +import de.steamwar.bausystem.region.dynamic.normal.display.MiniWarGear21DisplayRegion; +import de.steamwar.bausystem.region.dynamic.normal.display.WarGear21DisplayRegion; +import de.steamwar.bausystem.region.dynamic.normal.display.WarShip21DisplayRegion; import de.steamwar.bausystem.region.dynamic.normal.work.MicroWarGear21WorkRegion; import de.steamwar.bausystem.region.dynamic.normal.work.MiniWarGear21WorkRegion; import de.steamwar.bausystem.region.dynamic.normal.work.WarGear21WorkRegion; import de.steamwar.bausystem.region.dynamic.normal.work.WarShip21WorkRegion; import de.steamwar.bausystem.region.dynamic.path.PathRegion; +import de.steamwar.bausystem.region.dynamic.special.DrySpecialRegion; +import de.steamwar.bausystem.region.dynamic.special.WetSpecialRegion; import de.steamwar.bausystem.shared.Pair; import de.steamwar.bausystem.utils.PasteBuilder; import de.steamwar.command.AbstractSWCommand; @@ -99,10 +105,16 @@ public class DynamicRegionCommand extends SWCommand { @RequiredArgsConstructor public enum Placement { Path(PathRegion::new, 19, 19), - WarGear21(WarGear21WorkRegion::new, WarGear21WorkRegion.widthX, WarGear21WorkRegion.widthZ), - MiniWarGear21(MiniWarGear21WorkRegion::new, MiniWarGear21WorkRegion.widthX, MiniWarGear21WorkRegion.widthZ), - WarShip21(WarShip21WorkRegion::new, WarShip21WorkRegion.widthX, WarShip21WorkRegion.widthZ), - MicroWarGear21(MicroWarGear21WorkRegion::new, MicroWarGear21WorkRegion.widthX, MicroWarGear21WorkRegion.widthZ), + WetSpecial(WetSpecialRegion::new, 19, 19), + DrySpecial(DrySpecialRegion::new, 19, 19), + WarGearWork21(WarGear21WorkRegion::new, WarGear21WorkRegion.widthX, WarGear21WorkRegion.widthZ), + WarGearDisplay21(WarGear21DisplayRegion::new, WarGear21DisplayRegion.widthX, WarGear21DisplayRegion.widthZ), + MiniWarGearWork21(MiniWarGear21WorkRegion::new, MiniWarGear21WorkRegion.widthX, MiniWarGear21WorkRegion.widthZ), + MiniWarGearDisplay21(MiniWarGear21DisplayRegion::new, MiniWarGear21DisplayRegion.widthX, MiniWarGear21DisplayRegion.widthZ), + WarShipWork21(WarShip21WorkRegion::new, WarShip21WorkRegion.widthX, WarShip21WorkRegion.widthZ), + WarShipDisplay21(WarShip21DisplayRegion::new, WarShip21DisplayRegion.widthX, WarShip21DisplayRegion.widthZ), + MicroWarGearWork21(MicroWarGear21WorkRegion::new, MicroWarGear21WorkRegion.widthX, MicroWarGear21WorkRegion.widthZ), + MicroWarGearDisplay21(MicroWarGear21DisplayRegion::new, MicroWarGear21DisplayRegion.widthX, MicroWarGear21DisplayRegion.widthZ), ; private final BiFunction constructor; diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionSystem.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionSystem.java index def463e1..48eef262 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionSystem.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionSystem.java @@ -34,6 +34,7 @@ import org.bukkit.Location; import org.bukkit.World; import java.util.*; +import java.util.stream.Collectors; import java.util.stream.Stream; public class DynamicRegionSystem implements RegionSystem { @@ -90,14 +91,18 @@ public class DynamicRegionSystem implements RegionSystem { return GlobalRegion.INSTANCE; } - @Override - public @NonNull Region get(@NonNull Location location) { - return regionMap.values().stream() + private Region get(Location location, Collection regions) { + return regions.stream() .filter(region -> region.getArea().inRegion(location, false)) .findFirst() .orElse(GlobalRegion.INSTANCE); } + @Override + public @NonNull Region get(@NonNull Location location) { + return get(location, regionMap.values()); + } + @Override public Optional getRegion(@NonNull UUID id) { return Optional.ofNullable(regionMap.get(id)); @@ -108,24 +113,44 @@ public class DynamicRegionSystem implements RegionSystem { return regionMap.values().stream(); } - public Stream getNeighbours(Region region) { + private Stream getNeighbours(Region region, boolean noCorners, Collection regions) { Point minPoint = region.getArea().getMinPoint(false).subtract(18, 0, 18); Point maxPoint = region.getArea().getMaxPoint(false).add(19, 0, 19); - // TODO: Optimize Set away! Set neighbours = new HashSet<>(); - for (int x = minPoint.getX(); x <= maxPoint.getX(); x += 19) { + for (int x = minPoint.getX() + (noCorners ? 18 : 0); x <= maxPoint.getX() - (noCorners ? 19 : 0); x += 19) { int minZ = minPoint.getZ(); int maxZ = maxPoint.getZ(); - neighbours.add(get(new Location(WORLD, x, 0, minZ))); - neighbours.add(get(new Location(WORLD, x, 0, maxZ))); + neighbours.add(get(new Location(WORLD, x, 0, minZ), regions)); + neighbours.add(get(new Location(WORLD, x, 0, maxZ), regions)); } for (int z = minPoint.getZ() + 18; z <= maxPoint.getZ() - 19; z += 19) { int minX = minPoint.getX(); int maxX = maxPoint.getX(); - neighbours.add(get(new Location(WORLD, minX, 0, z))); - neighbours.add(get(new Location(WORLD, maxX, 0, z))); + neighbours.add(get(new Location(WORLD, minX, 0, z), regions)); + neighbours.add(get(new Location(WORLD, maxX, 0, z), regions)); } neighbours.remove(GlobalRegion.INSTANCE); return ((Set)(Set) neighbours).stream(); } + + public Stream getNeighbours(Region region) { + return getNeighbours(region, false, regionMap.values()); + } + + public Stream getConnectedRegions(DynamicRegion region) { + Set regions = regionMap.values() + .stream() + .filter(r -> r.getType() == region.getType()) + .collect(Collectors.toSet()); + + Set connectedRegions = new HashSet<>(); + LinkedHashSet current = new LinkedHashSet<>(); + current.add(region); + while (!current.isEmpty()) { + DynamicRegion r = current.removeFirst(); + if (!connectedRegions.add(r)) continue; + getNeighbours(r, true, regions).forEach(current::add); + } + return connectedRegions.stream(); + } } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DefaultFlagStorage.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DefaultFlagStorage.java index 3c7e6f92..152b296f 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DefaultFlagStorage.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DefaultFlagStorage.java @@ -56,8 +56,11 @@ public abstract class DefaultFlagStorage implements FlagStorage { return flagMap; } - @Override public void setSaveOperation(Consumer operation) { this.operation = operation; } + + public void save() { + operation.accept(this); + } } 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 cf62ac61..6c5b2eea 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 @@ -24,8 +24,12 @@ import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.world.block.BlockTypes; -import de.steamwar.bausystem.region.*; +import de.steamwar.bausystem.region.DynamicRegionSystem; +import de.steamwar.bausystem.region.Point; +import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.RegionBackups; import lombok.Getter; +import lombok.NonNull; import org.bukkit.Bukkit; import java.util.UUID; @@ -70,7 +74,10 @@ public abstract class DynamicRegion implements Region { public abstract void update(DynamicRegion updateFrom); - public abstract void setFlags(FlagStorage flags); + public abstract void setFlags(DefaultFlagStorage flags); + + @Override + public abstract @NonNull DefaultFlagStorage getFlags(); public void delete() { if (getType().isCannotDelete()) return; diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/RegionDataRepository.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/RegionDataRepository.java index 7da42807..e389c179 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/RegionDataRepository.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/RegionDataRepository.java @@ -28,6 +28,10 @@ import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionBackups; import de.steamwar.bausystem.region.dynamic.normal.NormalFlagStorage; +import de.steamwar.bausystem.region.dynamic.normal.display.MicroWarGear21DisplayRegion; +import de.steamwar.bausystem.region.dynamic.normal.display.MiniWarGear21DisplayRegion; +import de.steamwar.bausystem.region.dynamic.normal.display.WarGear21DisplayRegion; +import de.steamwar.bausystem.region.dynamic.normal.display.WarShip21DisplayRegion; import de.steamwar.bausystem.region.dynamic.normal.work.MicroWarGear21WorkRegion; import de.steamwar.bausystem.region.dynamic.normal.work.MiniWarGear21WorkRegion; import de.steamwar.bausystem.region.dynamic.normal.work.WarGear21WorkRegion; @@ -35,6 +39,8 @@ import de.steamwar.bausystem.region.dynamic.normal.work.WarShip21WorkRegion; import de.steamwar.bausystem.region.dynamic.path.PathRegion; import de.steamwar.bausystem.region.dynamic.spawn.SpawnPathRegion; import de.steamwar.bausystem.region.dynamic.spawn.SpawnRegion; +import de.steamwar.bausystem.region.dynamic.special.DrySpecialRegion; +import de.steamwar.bausystem.region.dynamic.special.WetSpecialRegion; import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.bausystem.utils.FlatteningWrapper; import de.steamwar.bausystem.utils.PasteBuilder; @@ -72,13 +78,19 @@ public class RegionDataRepository { regionCreators.put(SpawnRegion.class.getSimpleName(), SpawnRegion::new); regionCreators.put(SpawnPathRegion.class.getSimpleName(), SpawnPathRegion::new); regionCreators.put(PathRegion.class.getSimpleName(), PathRegion::new); + regionCreators.put(DrySpecialRegion.class.getSimpleName(), DrySpecialRegion::new); + regionCreators.put(WetSpecialRegion.class.getSimpleName(), WetSpecialRegion::new); regionCreators.put(WarGear21WorkRegion.class.getSimpleName(), WarGear21WorkRegion::new); + regionCreators.put(WarGear21DisplayRegion.class.getSimpleName(), WarGear21DisplayRegion::new); regionCreators.put("WarGear21Region", WarGear21WorkRegion::new); // TODO: Legacy because of rename regionCreators.put(MiniWarGear21WorkRegion.class.getSimpleName(), MiniWarGear21WorkRegion::new); + regionCreators.put(MiniWarGear21DisplayRegion.class.getSimpleName(), MiniWarGear21DisplayRegion::new); regionCreators.put("MiniWarGear21Region", MiniWarGear21WorkRegion::new); // TODO: Legacy because of rename regionCreators.put(WarShip21WorkRegion.class.getSimpleName(), WarShip21WorkRegion::new); + regionCreators.put(WarShip21DisplayRegion.class.getSimpleName(), WarShip21WorkRegion::new); regionCreators.put("WarShip21Region", WarShip21WorkRegion::new); // TODO: Legacy because of rename regionCreators.put(MicroWarGear21WorkRegion.class.getSimpleName(), MicroWarGear21WorkRegion::new); + regionCreators.put(MicroWarGear21DisplayRegion.class.getSimpleName(), MicroWarGear21DisplayRegion::new); regionCreators.put("MicroWarGear21Region", MicroWarGear21WorkRegion::new); // TODO: Legacy because of rename } @@ -119,7 +131,7 @@ public class RegionDataRepository { deleteDir(getRegionDirectory(region)); } - public void loadFlagStorage(Region region, FlagStorage storage) { + public void loadFlagStorage(Region region, DefaultFlagStorage storage) { File file = getRegionDirectory(region); file = new File(file, FLAGS_FILE_NAME); loadFlagStorage(file, storage); @@ -274,7 +286,7 @@ public class RegionDataRepository { .run(); region.getHistory().remember(editSession); region.getFlags().setSaveOperation(null); - region.setFlags(getFlags()); + region.setFlags((DefaultFlagStorage) getFlags()); region.getFlags().setSaveOperation(storage -> saveFlagStorage(region, storage)); return true; } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/global/GlobalRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/global/GlobalRegion.java index a0b021b0..79c53699 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/global/GlobalRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/global/GlobalRegion.java @@ -21,6 +21,7 @@ package de.steamwar.bausystem.region.dynamic.global; import com.sk89q.worldedit.extent.clipboard.Clipboard; import de.steamwar.bausystem.region.*; +import de.steamwar.bausystem.region.dynamic.DefaultFlagStorage; import de.steamwar.bausystem.region.dynamic.NonNormalFlagStorage; import de.steamwar.bausystem.region.dynamic.RegionDataRepository; import de.steamwar.bausystem.utils.PasteBuilder; @@ -90,7 +91,7 @@ public class GlobalRegion implements Region { private static final GameModeConfig GLOBAL_CONFIG = new GameModeConfig(null); - private static FlagStorage FLAG_STORAGE = new NonNormalFlagStorage(); + private static DefaultFlagStorage FLAG_STORAGE = new NonNormalFlagStorage(); static { RegionDataRepository.loadFlagStorage(INSTANCE, FLAG_STORAGE); } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/DisplayRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/DisplayRegion.java index 8793a311..5b8c7489 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/DisplayRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/DisplayRegion.java @@ -19,5 +19,51 @@ package de.steamwar.bausystem.region.dynamic.normal; -public class DisplayRegion { +import de.steamwar.bausystem.region.RegionHistory; +import de.steamwar.bausystem.region.dynamic.DefaultFlagStorage; +import de.steamwar.bausystem.region.dynamic.DynamicRegion; +import de.steamwar.bausystem.region.dynamic.RegionConstructorData; +import de.steamwar.bausystem.region.dynamic.RegionDataRepository; +import lombok.Getter; +import lombok.NonNull; + +public abstract class DisplayRegion extends DynamicRegion { + + @Getter + private DefaultFlagStorage flags = new NormalFlagStorage(); + + @Getter + protected NormalArea area = NormalArea.EMPTY; + + @Getter + private final RegionHistory history = new RegionHistory.Impl(20); + + protected DisplayRegion(int minX, int minZ) { + super(minX, minZ); + RegionDataRepository.loadFlagStorage(this, flags); + } + + protected DisplayRegion(RegionConstructorData regionConstructorData) { + super(regionConstructorData); + RegionDataRepository.loadFlagStorage(this, flags); + } + + @Override + public void update(DynamicRegion updateFrom) { + } + + @Override + public void setFlags(DefaultFlagStorage flags) { + this.flags = flags; + } + + @Override + public @NonNull Area getBuildArea() { + return Area.EMPTY; + } + + @Override + public @NonNull Area getTestblockArea() { + return Area.EMPTY; + } } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/NormalArea.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/NormalArea.java index 312df076..47fca378 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/NormalArea.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/NormalArea.java @@ -19,72 +19,108 @@ package de.steamwar.bausystem.region.dynamic.normal; -import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.EditSession; import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.dynamic.VariantSelector; +import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.bausystem.utils.PasteBuilder; +import lombok.NonNull; import org.bukkit.Location; +import javax.annotation.Nullable; import java.io.File; import java.util.function.BiConsumer; -public abstract class NormalArea implements Region.Area { +public class NormalArea implements Region.Area { - public abstract NormalArea setResetFile(VariantSelector variantSelector); + public static final NormalArea EMPTY = new NormalArea(0, 0, 0, 0, 0, 0, null, false, null) { + @Override + public void reset(PasteBuilder pasteBuilder, boolean extension) { + } - public static final NormalArea EMPTY = new NormalArea() { @Override public boolean isEmpty() { return true; } - @Override - public Point getMinPoint(boolean extension) { - return Point.ZERO; - } - - @Override - public Point getMaxPoint(boolean extension) { - return Point.ZERO; - } - - @Override - public Point getCopyPoint() { - return Point.ZERO; - } - @Override public boolean inRegion(Location location, boolean extension) { return false; } - @Override - public Clipboard copy(boolean extension) { - return null; - } - - @Override - public NormalArea setResetFile(VariantSelector variantSelector) { - return this; - } - - @Override - public File getResetFile() { - return null; - } - - @Override - public void reset(PasteBuilder pasteBuilder, boolean extension) { - } - @Override public void forEachChunk(BiConsumer executor) { } @Override public boolean isChunkOutside(int chunkX, int chunkZ) { - return false; + return true; } }; + + private final int minX; + private final int minY; + private final int minZ; + private final int widthX; + private final int widthY; + private final int widthZ; + private VariantSelector variantSelector; + private final Point minPoint; + private final Point maxPoint; + private final Point copyPoint; + private final boolean rotate; + private final Region region; + + public NormalArea(int minX, int minY, int minZ, int widthX, int widthY, int widthZ, VariantSelector variantSelector, boolean rotate, Region region) { + this.minX = minX; + this.minY = minY; + this.minZ = minZ; + this.widthX = widthX; + this.widthY = widthY; + this.widthZ = widthZ; + this.variantSelector = variantSelector; + this.rotate = rotate; + this.region = region; + + minPoint = new Point(minX, minY, minZ); + maxPoint = new Point(minX + widthX - 1, minY + widthY - 1, minZ + widthZ - 1); + copyPoint = minPoint.add(widthX / 2, widthY, widthZ / 2); + } + + @Override + public @NonNull Point getMinPoint(boolean extension) { + return minPoint; + } + + @Override + public @NonNull Point getMaxPoint(boolean extension) { + return maxPoint; + } + + @Override + public @NonNull Point getCopyPoint() { + return copyPoint; + } + + public NormalArea setResetFile(VariantSelector variantSelector) { + this.variantSelector = variantSelector; + return this; + } + + @Nullable + @Override + public File getResetFile() { + return variantSelector.selectVariant(minX, minZ).orElseThrow(); + } + + @Override + public void reset(PasteBuilder pasteBuilder, boolean extension) { + EditSession editSession = pasteBuilder.minPoint(minPoint) + .maxPoint(maxPoint) + .rotate(rotate) + .color(region.getFlags().get(Flag.COLOR).getWithDefault()) + .run(); + region.getHistory().remember(editSession); + } } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/WorkArea.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/WorkArea.java deleted file mode 100644 index 3a0f2b9e..00000000 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/WorkArea.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 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.normal; - -import com.sk89q.worldedit.EditSession; -import de.steamwar.bausystem.region.FlagStorage; -import de.steamwar.bausystem.region.Point; -import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.dynamic.VariantSelector; -import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.utils.PasteBuilder; -import lombok.NonNull; -import lombok.Setter; - -import javax.annotation.Nullable; -import java.io.File; - -public class WorkArea extends NormalArea { - - private final int minX; - private final int minY; - private final int minZ; - private final int widthX; - private final int widthY; - private final int widthZ; - private VariantSelector variantSelector; - private final Point minPoint; - private final Point maxPoint; - private final Point copyPoint; - private final boolean rotate; - private final Region region; - - public WorkArea(int minX, int minY, int minZ, int widthX, int widthY, int widthZ, VariantSelector variantSelector, boolean rotate, Region region) { - this.minX = minX; - this.minY = minY; - this.minZ = minZ; - this.widthX = widthX; - this.widthY = widthY; - this.widthZ = widthZ; - this.variantSelector = variantSelector; - this.rotate = rotate; - this.region = region; - - minPoint = new Point(minX, minY, minZ); - maxPoint = new Point(minX + widthX - 1, minY + widthY - 1, minZ + widthZ - 1); - copyPoint = minPoint.add(widthX / 2, widthY, widthZ / 2); - } - - @Override - public @NonNull Point getMinPoint(boolean extension) { - return minPoint; - } - - @Override - public @NonNull Point getMaxPoint(boolean extension) { - return maxPoint; - } - - @Override - public @NonNull Point getCopyPoint() { - return copyPoint; - } - - @Override - public NormalArea setResetFile(VariantSelector variantSelector) { - this.variantSelector = variantSelector; - return this; - } - - @Nullable - @Override - public File getResetFile() { - return variantSelector.selectVariant(minX, minZ).orElseThrow(); - } - - @Override - public void reset(PasteBuilder pasteBuilder, boolean extension) { - EditSession editSession = pasteBuilder.minPoint(minPoint) - .maxPoint(maxPoint) - .rotate(rotate) - .color(region.getFlags().get(Flag.COLOR).getWithDefault()) - .run(); - region.getHistory().remember(editSession); - } -} diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/WorkRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/WorkRegion.java index 85c4fe99..07bc39cc 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/WorkRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/WorkRegion.java @@ -20,12 +20,8 @@ package de.steamwar.bausystem.region.dynamic.normal; import de.steamwar.bausystem.region.FlagOptional; -import de.steamwar.bausystem.region.FlagStorage; import de.steamwar.bausystem.region.RegionHistory; -import de.steamwar.bausystem.region.dynamic.DynamicRegion; -import de.steamwar.bausystem.region.dynamic.RegionConstructorData; -import de.steamwar.bausystem.region.dynamic.RegionDataRepository; -import de.steamwar.bausystem.region.dynamic.VariantSelector; +import de.steamwar.bausystem.region.dynamic.*; import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.bausystem.region.flags.TestblockMode; import lombok.Getter; @@ -34,7 +30,7 @@ import lombok.NonNull; public abstract class WorkRegion extends DynamicRegion { @Getter - private FlagStorage flags = new NormalFlagStorage(); + private DefaultFlagStorage flags = new NormalFlagStorage(); @Getter protected NormalArea area = NormalArea.EMPTY; @@ -62,7 +58,7 @@ public abstract class WorkRegion extends DynamicRegion { } @Override - public void setFlags(FlagStorage flags) { + public void setFlags(DefaultFlagStorage flags) { this.flags = flags; } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/MicroWarGear21DisplayRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/MicroWarGear21DisplayRegion.java new file mode 100644 index 00000000..36ff321a --- /dev/null +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/MicroWarGear21DisplayRegion.java @@ -0,0 +1,59 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.normal.display; + +import de.steamwar.bausystem.region.GameModeConfig; +import de.steamwar.bausystem.region.RegionType; +import de.steamwar.bausystem.region.dynamic.RegionConstructorData; +import de.steamwar.bausystem.region.dynamic.VariantSelector; +import de.steamwar.bausystem.region.dynamic.normal.DisplayRegion; +import de.steamwar.bausystem.region.dynamic.normal.NormalArea; +import lombok.Getter; +import lombok.NonNull; +import org.bukkit.Bukkit; + +import java.io.File; + +public class MicroWarGear21DisplayRegion extends DisplayRegion { + + public static final int widthX = 57; + public static final int widthZ = 57; + + private static final File MODE_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/regions/microwargear21/"); + private static final File REGION_FILE = new File(MODE_DIR, "Display.schem"); + + @Getter + private final GameModeConfig gameModeConfig = new GameModeConfig(null); // TODO: Implement + + public MicroWarGear21DisplayRegion(int minX, int minZ) { + super(minX, minZ); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + } + + public MicroWarGear21DisplayRegion(RegionConstructorData regionConstructorData) { + super(regionConstructorData); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + } + + @Override + public @NonNull RegionType getType() { + return RegionType.DRY; + } +} diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/MiniWarGear21DisplayRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/MiniWarGear21DisplayRegion.java new file mode 100644 index 00000000..e97eabbc --- /dev/null +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/MiniWarGear21DisplayRegion.java @@ -0,0 +1,59 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.normal.display; + +import de.steamwar.bausystem.region.GameModeConfig; +import de.steamwar.bausystem.region.RegionType; +import de.steamwar.bausystem.region.dynamic.RegionConstructorData; +import de.steamwar.bausystem.region.dynamic.VariantSelector; +import de.steamwar.bausystem.region.dynamic.normal.DisplayRegion; +import de.steamwar.bausystem.region.dynamic.normal.NormalArea; +import lombok.Getter; +import lombok.NonNull; +import org.bukkit.Bukkit; + +import java.io.File; + +public class MiniWarGear21DisplayRegion extends DisplayRegion { + + public static final int widthX = 57; + public static final int widthZ = 38; + + private static final File MODE_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/regions/miniwargear21/"); + private static final File REGION_FILE = new File(MODE_DIR, "Display.schem"); + + @Getter + private final GameModeConfig gameModeConfig = new GameModeConfig(null); // TODO: Implement + + public MiniWarGear21DisplayRegion(int minX, int minZ) { + super(minX, minZ); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + } + + public MiniWarGear21DisplayRegion(RegionConstructorData regionConstructorData) { + super(regionConstructorData); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + } + + @Override + public @NonNull RegionType getType() { + return RegionType.DRY; + } +} diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/WarGear21DisplayRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/WarGear21DisplayRegion.java new file mode 100644 index 00000000..be778ebf --- /dev/null +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/WarGear21DisplayRegion.java @@ -0,0 +1,59 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.normal.display; + +import de.steamwar.bausystem.region.GameModeConfig; +import de.steamwar.bausystem.region.RegionType; +import de.steamwar.bausystem.region.dynamic.RegionConstructorData; +import de.steamwar.bausystem.region.dynamic.VariantSelector; +import de.steamwar.bausystem.region.dynamic.normal.DisplayRegion; +import de.steamwar.bausystem.region.dynamic.normal.NormalArea; +import lombok.Getter; +import lombok.NonNull; +import org.bukkit.Bukkit; + +import java.io.File; + +public class WarGear21DisplayRegion extends DisplayRegion { + + public static final int widthX = 133; + public static final int widthZ = 95; + + private static final File MODE_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/regions/wargear21/"); + private static final File REGION_FILE = new File(MODE_DIR, "Display.schem"); + + @Getter + private final GameModeConfig gameModeConfig = new GameModeConfig(null); // TODO: Implement + + public WarGear21DisplayRegion(int minX, int minZ) { + super(minX, minZ); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + } + + public WarGear21DisplayRegion(RegionConstructorData regionConstructorData) { + super(regionConstructorData); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + } + + @Override + public @NonNull RegionType getType() { + return RegionType.DRY; + } +} diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/WarShip21DisplayRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/WarShip21DisplayRegion.java new file mode 100644 index 00000000..21859326 --- /dev/null +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/display/WarShip21DisplayRegion.java @@ -0,0 +1,59 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.normal.display; + +import de.steamwar.bausystem.region.GameModeConfig; +import de.steamwar.bausystem.region.RegionType; +import de.steamwar.bausystem.region.dynamic.RegionConstructorData; +import de.steamwar.bausystem.region.dynamic.VariantSelector; +import de.steamwar.bausystem.region.dynamic.normal.DisplayRegion; +import de.steamwar.bausystem.region.dynamic.normal.NormalArea; +import lombok.Getter; +import lombok.NonNull; +import org.bukkit.Bukkit; + +import java.io.File; + +public class WarShip21DisplayRegion extends DisplayRegion { + + public static final int widthX = 266; + public static final int widthZ = 95; + + private static final File MODE_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/regions/warship21/"); + private static final File REGION_FILE = new File(MODE_DIR, "Display.schem"); + + @Getter + private final GameModeConfig gameModeConfig = new GameModeConfig(null); // TODO: Implement + + public WarShip21DisplayRegion(int minX, int minZ) { + super(minX, minZ); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + } + + public WarShip21DisplayRegion(RegionConstructorData regionConstructorData) { + super(regionConstructorData); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + } + + @Override + public @NonNull RegionType getType() { + return RegionType.DRY; + } +} diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/MicroWarGear21WorkRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/MicroWarGear21WorkRegion.java index dbb7be19..9739477c 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/MicroWarGear21WorkRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/MicroWarGear21WorkRegion.java @@ -23,7 +23,7 @@ import de.steamwar.bausystem.region.GameModeConfig; import de.steamwar.bausystem.region.RegionType; import de.steamwar.bausystem.region.dynamic.RegionConstructorData; import de.steamwar.bausystem.region.dynamic.VariantSelector; -import de.steamwar.bausystem.region.dynamic.normal.WorkArea; +import de.steamwar.bausystem.region.dynamic.normal.NormalArea; import de.steamwar.bausystem.region.dynamic.normal.WorkRegion; import lombok.Getter; import lombok.NonNull; @@ -37,7 +37,7 @@ public class MicroWarGear21WorkRegion extends WorkRegion { public static final int widthZ = 114; private static final File MODE_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/regions/microwargear21/"); - private static final File REGION_FILE = new File(MODE_DIR, "Region.schem"); + private static final File REGION_FILE = new File(MODE_DIR, "Work.schem"); private static final File FRAME_FILE = new File(MODE_DIR, "Frame.schem"); private static final File TESTBLOCK_FILE = new File(MODE_DIR, "Testblock.schem"); @@ -46,18 +46,18 @@ public class MicroWarGear21WorkRegion extends WorkRegion { public MicroWarGear21WorkRegion(int minX, int minZ) { super(minX, minZ); - area = new WorkArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); - northArea = new WorkArea(minX + 25, 32, minZ + 25, 7, 7, 7, null, false, this); - southArea = new WorkArea(minX + 25, 32, minZ + 82, 7, 7, 7, null, true, this); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + northArea = new NormalArea(minX + 25, 32, minZ + 25, 7, 7, 7, null, false, this); + southArea = new NormalArea(minX + 25, 32, minZ + 82, 7, 7, 7, null, true, this); frame = VariantSelector.File(FRAME_FILE); testblock = VariantSelector.File(TESTBLOCK_FILE); } public MicroWarGear21WorkRegion(RegionConstructorData regionConstructorData) { super(regionConstructorData); - area = new WorkArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); - northArea = new WorkArea(minX + 25, 32, minZ + 25, 7, 7, 7, null, false, this); - southArea = new WorkArea(minX + 25, 32, minZ + 82, 7, 7, 7, null, true, this); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + northArea = new NormalArea(minX + 25, 32, minZ + 25, 7, 7, 7, null, false, this); + southArea = new NormalArea(minX + 25, 32, minZ + 82, 7, 7, 7, null, true, this); frame = VariantSelector.File(FRAME_FILE); testblock = VariantSelector.File(TESTBLOCK_FILE); } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/MiniWarGear21WorkRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/MiniWarGear21WorkRegion.java index f4455923..77fce2df 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/MiniWarGear21WorkRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/MiniWarGear21WorkRegion.java @@ -23,7 +23,7 @@ import de.steamwar.bausystem.region.GameModeConfig; import de.steamwar.bausystem.region.RegionType; import de.steamwar.bausystem.region.dynamic.RegionConstructorData; import de.steamwar.bausystem.region.dynamic.VariantSelector; -import de.steamwar.bausystem.region.dynamic.normal.WorkArea; +import de.steamwar.bausystem.region.dynamic.normal.NormalArea; import de.steamwar.bausystem.region.dynamic.normal.WorkRegion; import lombok.Getter; import lombok.NonNull; @@ -37,7 +37,7 @@ public class MiniWarGear21WorkRegion extends WorkRegion { public static final int widthZ = 152; private static final File MODE_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/regions/miniwargear21/"); - private static final File REGION_FILE = new File(MODE_DIR, "Region.schem"); + private static final File REGION_FILE = new File(MODE_DIR, "Work.schem"); private static final File FRAME_FILE = new File(MODE_DIR, "Frame.schem"); private static final File TESTBLOCK_FILE = new File(MODE_DIR, "Testblock.schem"); @@ -46,18 +46,18 @@ public class MiniWarGear21WorkRegion extends WorkRegion { public MiniWarGear21WorkRegion(int minX, int minZ) { super(minX, minZ); - area = new WorkArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); - northArea = new WorkArea(minX + 29, 32, minZ + 29, 37, 26, 22, null, false, this); - southArea = new WorkArea(minX + 29, 32, minZ + 101, 37, 26, 22, null, true, this); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + northArea = new NormalArea(minX + 29, 32, minZ + 29, 37, 26, 22, null, false, this); + southArea = new NormalArea(minX + 29, 32, minZ + 101, 37, 26, 22, null, true, this); frame = VariantSelector.File(FRAME_FILE); testblock = VariantSelector.File(TESTBLOCK_FILE); } public MiniWarGear21WorkRegion(RegionConstructorData regionConstructorData) { super(regionConstructorData); - area = new WorkArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); - northArea = new WorkArea(minX + 29, 32, minZ + 29, 37, 26, 22, null, false, this); - southArea = new WorkArea(minX + 29, 32, minZ + 101, 37, 26, 22, null, true, this); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + northArea = new NormalArea(minX + 29, 32, minZ + 29, 37, 26, 22, null, false, this); + southArea = new NormalArea(minX + 29, 32, minZ + 101, 37, 26, 22, null, true, this); frame = VariantSelector.File(FRAME_FILE); testblock = VariantSelector.File(TESTBLOCK_FILE); } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/WarGear21WorkRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/WarGear21WorkRegion.java index cee7d39a..ff3075d8 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/WarGear21WorkRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/WarGear21WorkRegion.java @@ -23,7 +23,7 @@ import de.steamwar.bausystem.region.GameModeConfig; import de.steamwar.bausystem.region.RegionType; import de.steamwar.bausystem.region.dynamic.RegionConstructorData; import de.steamwar.bausystem.region.dynamic.VariantSelector; -import de.steamwar.bausystem.region.dynamic.normal.WorkArea; +import de.steamwar.bausystem.region.dynamic.normal.NormalArea; import de.steamwar.bausystem.region.dynamic.normal.WorkRegion; import lombok.Getter; import lombok.NonNull; @@ -37,7 +37,7 @@ public class WarGear21WorkRegion extends WorkRegion { public static final int widthZ = 228; private static final File MODE_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/regions/wargear21/"); - private static final File REGION_FILE = new File(MODE_DIR, "Region.schem"); + private static final File REGION_FILE = new File(MODE_DIR, "Work.schem"); private static final File FRAME_FILE = new File(MODE_DIR, "Frame.schem"); private static final File TESTBLOCK_FILE = new File(MODE_DIR, "Testblock.schem"); @@ -46,18 +46,18 @@ public class WarGear21WorkRegion extends WorkRegion { public WarGear21WorkRegion(int minX, int minZ) { super(minX, minZ); - area = new WorkArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); - northArea = new WorkArea(minX + 33, 32, minZ + 42, 67, 41, 47, null, false, this); - southArea = new WorkArea(minX + 33, 32, minZ + 139, 67, 41, 47, null, true, this); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + northArea = new NormalArea(minX + 33, 32, minZ + 42, 67, 41, 47, null, false, this); + southArea = new NormalArea(minX + 33, 32, minZ + 139, 67, 41, 47, null, true, this); frame = VariantSelector.File(FRAME_FILE); testblock = VariantSelector.File(TESTBLOCK_FILE); } public WarGear21WorkRegion(RegionConstructorData regionConstructorData) { super(regionConstructorData); - area = new WorkArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); - northArea = new WorkArea(minX + 33, 32, minZ + 42, 67, 41, 47, null, false, this); - southArea = new WorkArea(minX + 33, 32, minZ + 139, 67, 41, 47, null, true, this); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + northArea = new NormalArea(minX + 33, 32, minZ + 42, 67, 41, 47, null, false, this); + southArea = new NormalArea(minX + 33, 32, minZ + 139, 67, 41, 47, null, true, this); frame = VariantSelector.File(FRAME_FILE); testblock = VariantSelector.File(TESTBLOCK_FILE); } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/WarShip21WorkRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/WarShip21WorkRegion.java index 23658fa8..eb0e5133 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/WarShip21WorkRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/normal/work/WarShip21WorkRegion.java @@ -23,7 +23,7 @@ import de.steamwar.bausystem.region.GameModeConfig; import de.steamwar.bausystem.region.RegionType; import de.steamwar.bausystem.region.dynamic.RegionConstructorData; import de.steamwar.bausystem.region.dynamic.VariantSelector; -import de.steamwar.bausystem.region.dynamic.normal.WorkArea; +import de.steamwar.bausystem.region.dynamic.normal.NormalArea; import de.steamwar.bausystem.region.dynamic.normal.WorkRegion; import lombok.Getter; import lombok.NonNull; @@ -37,7 +37,7 @@ public class WarShip21WorkRegion extends WorkRegion { public static final int widthZ = 228; private static final File MODE_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/regions/warship21/"); - private static final File REGION_FILE = new File(MODE_DIR, "Region.schem"); + private static final File REGION_FILE = new File(MODE_DIR, "Work.schem"); private static final File FRAME_FILE = new File(MODE_DIR, "Frame.schem"); private static final File TESTBLOCK_FILE = new File(MODE_DIR, "Testblock.schem"); @@ -46,18 +46,18 @@ public class WarShip21WorkRegion extends WorkRegion { public WarShip21WorkRegion(int minX, int minZ) { super(minX, minZ); - area = new WorkArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); - // northArea = new WorkArea(minX + 33, 32, minZ + 42, 67, 41, 47, null, false, this); - // southArea = new WorkArea(minX + 33, 32, minZ + 139, 67, 41, 47, null, true, this); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + northArea = new NormalArea(minX + 28, 19, minZ + 25, 230, 58, 43, null, false, this); + southArea = new NormalArea(minX + 28, 19, minZ + 160, 230, 58, 43, null, true, this); frame = VariantSelector.File(FRAME_FILE); testblock = VariantSelector.File(TESTBLOCK_FILE); } public WarShip21WorkRegion(RegionConstructorData regionConstructorData) { super(regionConstructorData); - area = new WorkArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); - // northArea = new WorkArea(minX + 33, 32, minZ + 42, 67, 41, 47, null, false, this); - // southArea = new WorkArea(minX + 33, 32, minZ + 139, 67, 41, 47, null, true, this); + area = new NormalArea(minX, 0, minZ, widthX, 255, widthZ, VariantSelector.File(REGION_FILE), false, this); + northArea = new NormalArea(minX + 28, 19, minZ + 25, 230, 58, 43, null, false, this); + southArea = new NormalArea(minX + 28, 19, minZ + 160, 230, 58, 43, null, true, this); frame = VariantSelector.File(FRAME_FILE); testblock = VariantSelector.File(TESTBLOCK_FILE); } 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 a45098bc..bc89defa 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,7 +19,6 @@ package de.steamwar.bausystem.region.dynamic.path; -import de.steamwar.bausystem.region.FlagStorage; import de.steamwar.bausystem.region.GameModeConfig; import de.steamwar.bausystem.region.RegionHistory; import de.steamwar.bausystem.region.RegionType; @@ -35,7 +34,7 @@ public class PathRegion extends DynamicRegion { private static final File SECTIONS_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections"); private static final File RESET_FILE = new File(SECTIONS_DIR, "path/Path.schem"); // Temp - private FlagStorage flagStorage = new NonNormalFlagStorage(); + private DefaultFlagStorage flagStorage = new NonNormalFlagStorage(); private final Area area; private final GameModeConfig config = new GameModeConfig(null); @@ -67,7 +66,7 @@ public class PathRegion extends DynamicRegion { } @Override - public void setFlags(FlagStorage flags) { + public void setFlags(DefaultFlagStorage flags) { } @Override @@ -80,7 +79,7 @@ public class PathRegion extends DynamicRegion { } @Override - public @NonNull FlagStorage getFlags() { + public @NonNull DefaultFlagStorage getFlags() { return flagStorage; } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/spawn/SpawnPathRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/spawn/SpawnPathRegion.java index 23241f9d..43f9fe2c 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/spawn/SpawnPathRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/spawn/SpawnPathRegion.java @@ -19,7 +19,6 @@ package de.steamwar.bausystem.region.dynamic.spawn; -import de.steamwar.bausystem.region.FlagStorage; import de.steamwar.bausystem.region.GameModeConfig; import de.steamwar.bausystem.region.RegionHistory; import de.steamwar.bausystem.region.RegionType; @@ -37,7 +36,7 @@ public class SpawnPathRegion extends DynamicRegion { private static final File RESET_FILE_WEST = new File(SECTIONS_DIR, "spawn/SpawnWest.schem"); private static final File RESET_FILE_EAST = new File(SECTIONS_DIR, "spawn/SpawnEast.schem"); - private FlagStorage flagStorage = new NonNormalFlagStorage(); + private DefaultFlagStorage flagStorage = new NonNormalFlagStorage(); private final Area area; private final GameModeConfig config = new GameModeConfig(null); @@ -72,7 +71,7 @@ public class SpawnPathRegion extends DynamicRegion { } @Override - public void setFlags(FlagStorage flags) { + public void setFlags(DefaultFlagStorage flags) { } @Override @@ -81,7 +80,7 @@ public class SpawnPathRegion extends DynamicRegion { } @Override - public @NonNull FlagStorage getFlags() { + public @NonNull DefaultFlagStorage getFlags() { return flagStorage; } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/spawn/SpawnRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/spawn/SpawnRegion.java index 2662b22b..97a1832d 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/spawn/SpawnRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/spawn/SpawnRegion.java @@ -19,7 +19,6 @@ package de.steamwar.bausystem.region.dynamic.spawn; -import de.steamwar.bausystem.region.FlagStorage; import de.steamwar.bausystem.region.GameModeConfig; import de.steamwar.bausystem.region.RegionHistory; import de.steamwar.bausystem.region.RegionType; @@ -34,7 +33,7 @@ public class SpawnRegion extends DynamicRegion { private static final File SECTIONS_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections"); private static final File RESET_FILE = new File(SECTIONS_DIR, "spawn/SpawnMiddle.schem"); - private FlagStorage flagStorage = new NonNormalFlagStorage(); + private DefaultFlagStorage flagStorage = new NonNormalFlagStorage(); private final Area area; private final GameModeConfig config = new GameModeConfig(null); @@ -56,7 +55,7 @@ public class SpawnRegion extends DynamicRegion { } @Override - public void setFlags(FlagStorage flags) { + public void setFlags(DefaultFlagStorage flags) { } @Override @@ -65,7 +64,7 @@ public class SpawnRegion extends DynamicRegion { } @Override - public @NonNull FlagStorage getFlags() { + public @NonNull DefaultFlagStorage getFlags() { return flagStorage; } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/DrySpecialRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/DrySpecialRegion.java index ad5ab911..ac13f278 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/DrySpecialRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/DrySpecialRegion.java @@ -19,5 +19,36 @@ package de.steamwar.bausystem.region.dynamic.special; -public class DrySpecialRegion { +import de.steamwar.bausystem.region.RegionType; +import de.steamwar.bausystem.region.dynamic.RegionConstructorData; +import de.steamwar.bausystem.region.dynamic.VariantSelector; +import lombok.NonNull; +import org.bukkit.Bukkit; + +import java.io.File; + +public class DrySpecialRegion extends SpecialRegion { + + private static final File SECTIONS_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections"); + private static final File RESET_FILE = new File(SECTIONS_DIR, "special/DryRegion.schem"); + + public DrySpecialRegion(int minX, int minZ) { + super(minX, minZ); + area = new SpecialAreaTile(minX, minZ, VariantSelector.File(RESET_FILE)); + } + + public DrySpecialRegion(RegionConstructorData regionConstructorData) { + super(regionConstructorData); + area = new SpecialAreaTile(minX, minZ, VariantSelector.File(RESET_FILE)); + } + + @Override + public @NonNull RegionType getType() { + return RegionType.DRY_SPECIAL; + } + + @Override + public int getFloorLevel() { + return 32; + } } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialAreaTile.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialAreaTile.java index 149b3d34..81ebfc3c 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialAreaTile.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialAreaTile.java @@ -19,5 +19,60 @@ package de.steamwar.bausystem.region.dynamic.special; -public class SpecialAreaTile { +import de.steamwar.bausystem.region.Point; +import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.dynamic.VariantSelector; +import de.steamwar.bausystem.utils.PasteBuilder; +import lombok.NonNull; + +import javax.annotation.Nullable; +import java.io.File; + +public class SpecialAreaTile implements Region.Area { + + private final int minX; + private final int minZ; + private final VariantSelector variantSelector; + + private final Point minPoint; + private final Point maxPoint; + private final Point copyPoint; + + public SpecialAreaTile(int minX, int minZ, VariantSelector variantSelector) { + this.minX = minX; + this.minZ = minZ; + this.variantSelector = variantSelector; + + minPoint = new Point(minX, 0, minZ); + maxPoint = new Point(minX + 18, 255, minZ + 18); + copyPoint = new Point(minX + 9, 0, minZ + 9); + } + + @Override + public @NonNull Point getMinPoint(boolean extension) { + return minPoint; + } + + @Override + public @NonNull Point getMaxPoint(boolean extension) { + return maxPoint; + } + + @Override + public @NonNull Point getCopyPoint() { + return copyPoint; + } + + @Nullable + @Override + public File getResetFile() { + return variantSelector.selectVariant(minX, minZ).orElseThrow(); + } + + @Override + public void reset(PasteBuilder pasteBuilder, boolean extension) { + pasteBuilder.minPoint(minPoint) + .maxPoint(maxPoint) + .run(); + } } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialFlagStorage.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialFlagStorage.java new file mode 100644 index 00000000..ce7c9b4c --- /dev/null +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialFlagStorage.java @@ -0,0 +1,47 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 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.special; + +import de.steamwar.bausystem.region.DynamicRegionSystem; +import de.steamwar.bausystem.region.dynamic.DynamicRegion; +import de.steamwar.bausystem.region.dynamic.normal.NormalFlagStorage; +import de.steamwar.bausystem.region.flags.Flag; +import de.steamwar.bausystem.region.flags.TNTMode; +import lombok.NonNull; + +public class SpecialFlagStorage extends NormalFlagStorage { + + private DynamicRegion region; + + public SpecialFlagStorage(DynamicRegion region) { + this.region = region; + flagMap.put(Flag.TNT, TNTMode.DENY); + } + + @Override + public & Flag.Value> boolean set(@NonNull Flag flag, @NonNull T value) { + boolean result = super.set(flag, value); + DynamicRegionSystem.INSTANCE.getConnectedRegions(region).forEach(other -> { + other.getFlags().getBackedMap().put(flag, value); + other.getFlags().save(); + }); + return result; + } +} diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialRegion.java index badaffe9..29819c6b 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialRegion.java @@ -19,5 +19,61 @@ package de.steamwar.bausystem.region.dynamic.special; -public class SpecialRegion { +import de.steamwar.bausystem.region.GameModeConfig; +import de.steamwar.bausystem.region.RegionHistory; +import de.steamwar.bausystem.region.dynamic.DefaultFlagStorage; +import de.steamwar.bausystem.region.dynamic.DynamicRegion; +import de.steamwar.bausystem.region.dynamic.RegionConstructorData; +import de.steamwar.bausystem.region.dynamic.RegionDataRepository; +import lombok.Getter; +import lombok.NonNull; + +public abstract class SpecialRegion extends DynamicRegion { + + @Getter + private DefaultFlagStorage flags = new SpecialFlagStorage(this); + + @Getter + protected SpecialAreaTile area; + + private final GameModeConfig config = new GameModeConfig(null); + + protected SpecialRegion(int minX, int minZ) { + super(minX, minZ); + RegionDataRepository.loadFlagStorage(this, flags); + } + + protected SpecialRegion(RegionConstructorData regionConstructorData) { + super(regionConstructorData); + RegionDataRepository.loadFlagStorage(this, flags); + } + + @Override + public void update(DynamicRegion updateFrom) { + } + + @Override + public void setFlags(DefaultFlagStorage flags) { + this.flags = flags; + } + + @Override + public @NonNull Area getBuildArea() { + return Area.EMPTY; + } + + @Override + public @NonNull Area getTestblockArea() { + return Area.EMPTY; + } + + @Override + public @NonNull GameModeConfig getGameModeConfig() { + return config; + } + + @Override + public @NonNull RegionHistory getHistory() { + return RegionHistory.EMPTY; + } } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/WetSpecialRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/WetSpecialRegion.java index b24e20df..607d5f87 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/WetSpecialRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/WetSpecialRegion.java @@ -19,5 +19,31 @@ package de.steamwar.bausystem.region.dynamic.special; -public class WetSpecialRegion { +import de.steamwar.bausystem.region.RegionType; +import de.steamwar.bausystem.region.dynamic.RegionConstructorData; +import de.steamwar.bausystem.region.dynamic.VariantSelector; +import lombok.NonNull; +import org.bukkit.Bukkit; + +import java.io.File; + +public class WetSpecialRegion extends SpecialRegion { + + private static final File SECTIONS_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections"); + private static final File RESET_FILE = new File(SECTIONS_DIR, "special/WetRegion.schem"); + + public WetSpecialRegion(int minX, int minZ) { + super(minX, minZ); + area = new SpecialAreaTile(minX, minZ, VariantSelector.File(RESET_FILE)); + } + + public WetSpecialRegion(RegionConstructorData regionConstructorData) { + super(regionConstructorData); + area = new SpecialAreaTile(minX, minZ, VariantSelector.File(RESET_FILE)); + } + + @Override + public @NonNull RegionType getType() { + return RegionType.WET_SPECIAL; + } }