Add DynamicRegion

This commit is contained in:
2025-12-19 17:25:12 +01:00
parent 5958befced
commit 54f8dc9eb0
9 changed files with 160 additions and 66 deletions
@@ -31,6 +31,8 @@ java {
}
dependencies {
compileOnly(libs.classindex)
compileOnly(project(":BauSystem:BauSystem_Main", "default"))
compileOnly(project(":SpigotCore", "default"))
@@ -19,20 +19,22 @@
package de.steamwar.bausystem.region;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.region.dynamic.DynamicRegion;
import de.steamwar.bausystem.region.dynamic.RegionConstructorData;
import de.steamwar.bausystem.region.dynamic.Tile;
import de.steamwar.bausystem.region.dynamic.global.GlobalRegion;
import lombok.NonNull;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Stream;
public class DynamicRegionSystem implements RegionSystem {
public static DynamicRegionSystem INSTANCE;
private static final World WORLD = Bukkit.getWorlds().get(0);
private static final Map<Long, Region> regionCache = new LinkedHashMap<>(16, 0.75f, true) {
@Override
@@ -43,13 +45,36 @@ public class DynamicRegionSystem implements RegionSystem {
private static final Map<UUID, Region> regionMap = new HashMap<>();
private static final Map<RegionType, Set<Region>> regionTypeMap = new EnumMap<>(RegionType.class);
@Override
public void load() {
INSTANCE = this;
public void add(DynamicRegion region) {
regionCache.clear();
regionMap.put(region.getID(), region);
regionTypeMap.computeIfAbsent(region.getType(), __ -> new HashSet<>()).add(region);
}
public void remove(DynamicRegion region) {
regionCache.clear();
regionMap.remove(region.getId());
regionTypeMap.getOrDefault(region.getType(), Collections.emptySet()).remove(region);
}
@Override
public void save() {
public void load() {
INSTANCE = this;
new BufferedReader(new InputStreamReader(BauSystem.getInstance().getClass().getResourceAsStream("/META-INF/annotations/de.steamwar.bausystem.region.dynamic.RegionConstructorData")))
.lines()
.map(s -> {
try {
return Class.forName(s, false, BauSystem.getInstance().getClass().getClassLoader());
} catch (ClassNotFoundException | NoClassDefFoundError e) {
throw new SecurityException(e.getMessage(), e);
}
})
.forEach(clazz -> {
RegionConstructorData regionConstructorData = clazz.getAnnotation(RegionConstructorData.class);
if (regionConstructorData == null) return;
// TODO: Save regionConstructorData together with clazz
});
}
@Override
@@ -0,0 +1,55 @@
/*
* 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 <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bausystem.region.dynamic;
import de.steamwar.bausystem.region.DynamicRegionSystem;
import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.region.RegionData;
import lombok.Getter;
import lombok.NonNull;
import java.util.UUID;
public abstract class DynamicRegion implements Region {
@Getter
protected final UUID id;
protected final int minX;
protected final int minZ;
protected DynamicRegion(UUID id, int minX, int minZ) {
this.id = id;
this.minX = minX;
this.minZ = minZ;
DynamicRegionSystem.INSTANCE.add(this);
// TODO: Implement further
}
public void update(DynamicRegion updateFrom) {
}
public abstract void setRegionData(@NonNull RegionData regionData);
public void delete() {
if (getType().isCannotDelete()) return;
DynamicRegionSystem.INSTANCE.remove(this);
// TODO: Implement!
}
}
@@ -17,10 +17,22 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bausystem.region;
package de.steamwar.bausystem.region.dynamic;
public abstract class RegionConstructor<T extends Region> {
public abstract int getWidthX();
public abstract int getWidthZ();
public abstract T create(int tileX, int tileZ);
import de.steamwar.bausystem.region.RegionData;
import org.atteo.classindex.IndexAnnotated;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@IndexAnnotated
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface RegionConstructorData {
int widthX();
int widthZ();
boolean placeable() default true;
Class<? extends RegionData> regionDataClass();
}
@@ -33,6 +33,10 @@ public class GlobalRegionData extends RegionData {
public GlobalRegionData() {
super(new YAPIONObject(), () -> {}); // TODO: Implement loading of data and saving!
}
@Override
protected void initialize() {
flagMap.put(Flag.TNT, TNTMode.DENY);
flagMap.put(Flag.COLOR, ColorMode.YELLOW);
flagMap.put(Flag.PROTECT, ProtectMode.INACTIVE);