/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2025 SteamWar.de-Serverteam
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package de.steamwar.bausystem.region;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import de.steamwar.bausystem.utils.FlatteningWrapper;
import de.steamwar.bausystem.utils.PasteBuilder;
import de.steamwar.sql.GameModeConfig;
import lombok.NonNull;
import org.bukkit.Location;
import org.bukkit.Material;
import javax.annotation.Nullable;
import java.io.File;
import java.util.UUID;
import java.util.function.BiConsumer;
import java.util.stream.Stream;
public interface Region {
static Stream getRegions() {
return RegionSystem.INSTANCE.getRegions();
}
static Region getRegion(Location location) {
return RegionSystem.INSTANCE.get(location);
}
static Region getGlobalRegion() {
return RegionSystem.INSTANCE.getGlobalRegion();
}
@NonNull
UUID getID();
@NonNull
RegionType getType();
@NonNull
RegionData getRegionData();
@NonNull
Area getArea();
@NonNull
Area getBuildArea();
@NonNull
Area getTestblockArea();
@NonNull
GameModeConfig getGameModeConfig();
@NonNull
RegionHistory getHistory();
@NonNull
RegionBackups getBackups();
interface Area {
Area EMPTY = new Area() {
@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 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;
}
};
default boolean isEmpty() {
return false;
}
@NonNull
Point getMinPoint(boolean extension);
@NonNull
Point getMaxPoint(boolean extension);
@NonNull
Point getCopyPoint();
default boolean inRegion(Location location, boolean extension) {
Point minPoint = getMinPoint(extension);
Point maxPoint = getMaxPoint(extension);
if (location.getBlockX() < minPoint.getX() || location.getBlockX() > maxPoint.getX()) return false;
if (location.getBlockY() < minPoint.getY() || location.getBlockY() > maxPoint.getY()) return false;
if (location.getBlockZ() < minPoint.getZ() || location.getBlockZ() > maxPoint.getZ()) return false;
return true;
}
@Nullable
default Clipboard copy(boolean extension) {
return FlatteningWrapper.impl.copy(getMinPoint(extension), getMaxPoint(extension), getCopyPoint());
}
@Nullable
File getResetFile();
void reset(PasteBuilder pasteBuilder, boolean extension);
default void forEachChunk(BiConsumer executor) {
Point minPoint = getMinPoint(false);
Point maxPoint = getMaxPoint(false);
for (int x = (int) Math.floor(minPoint.getX() / 16.0); x <= (int) Math.ceil(maxPoint.getX() / 16.0); x++) {
for (int z = (int) Math.floor(minPoint.getZ() / 16.0); z <= (int) Math.ceil(maxPoint.getZ() / 16.0); z++) {
executor.accept(x, z);
}
}
}
default boolean isChunkOutside(int chunkX, int chunkZ) {
Point minPoint = getMinPoint(true);
Point maxPoint = getMaxPoint(true);
return Math.floor(minPoint.getX() / 16.0) > chunkX || chunkX >= Math.ceil(maxPoint.getX() / 16.0) ||
Math.floor(minPoint.getZ() / 16.0) > chunkZ || chunkZ >= Math.ceil(maxPoint.getZ() / 16.0);
}
}
}