diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionSystem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionSystem.java index 5a2b2b5e..9718af01 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionSystem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionSystem.java @@ -19,6 +19,7 @@ package de.steamwar.bausystem.region; +import de.steamwar.core.Core; import lombok.NonNull; import org.bukkit.Location; @@ -39,11 +40,6 @@ public interface RegionSystem { */ void load(); - /** - * Saves anything that should be written to file on either CRIUSleepEvent or plugin disable. - */ - void save(); - /** * Returns the Location to teleport players to when they first join or Warp to "WorldSpawn" */ @@ -77,52 +73,51 @@ public interface RegionSystem { Stream getRegions(); private static RegionSystem init() { - try { - return (RegionSystem) Class.forName("de.steamwar.bausystem.region.DynamicRegionSystem").getConstructor().newInstance(); - } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | - InvocationTargetException e) { - // Ignore + if (Core.getVersion() >= 21) { + // TODO: Add some kind of detection if the DynamicRegionSystem should be used! + try { + return (RegionSystem) Class.forName("de.steamwar.bausystem.region.DynamicRegionSystem").getConstructor().newInstance(); + } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | + InvocationTargetException e) { + // Ignore + } } try { return (RegionSystem) Class.forName("de.steamwar.bausystem.region.FixedRegionSystem").getConstructor().newInstance(); } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) { - return new RegionSystem() { - @Override - public void load() { - throw new UnsupportedOperationException(); - } - - @Override - public void save() { - throw new UnsupportedOperationException(); - } - - @Override - public @NonNull Location getWorldSpawn() { - throw new UnsupportedOperationException(); - } - - @Override - public Region getGlobalRegion() { - throw new UnsupportedOperationException(); - } - - @Override - public Region get(Location location) { - throw new UnsupportedOperationException(); - } - - @Override - public Optional getRegion(UUID id) { - throw new UnsupportedOperationException(); - } - - @Override - public Stream getRegions() { - throw new UnsupportedOperationException(); - } - }; + // Ignore } + return new RegionSystem() { + @Override + public void load() { + throw new UnsupportedOperationException(); + } + + @Override + public @NonNull Location getWorldSpawn() { + throw new UnsupportedOperationException(); + } + + @Override + public Region getGlobalRegion() { + throw new UnsupportedOperationException(); + } + + @Override + public Region get(Location location) { + throw new UnsupportedOperationException(); + } + + @Override + public Optional getRegion(UUID id) { + throw new UnsupportedOperationException(); + } + + @Override + public Stream getRegions() { + throw new UnsupportedOperationException(); + } + }; } } diff --git a/BauSystem/BauSystem_RegionDynamic/build.gradle.kts b/BauSystem/BauSystem_RegionDynamic/build.gradle.kts index 26348a9e..b4cccb47 100644 --- a/BauSystem/BauSystem_RegionDynamic/build.gradle.kts +++ b/BauSystem/BauSystem_RegionDynamic/build.gradle.kts @@ -31,6 +31,8 @@ java { } dependencies { + compileOnly(libs.classindex) + compileOnly(project(":BauSystem:BauSystem_Main", "default")) compileOnly(project(":SpigotCore", "default")) 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 70505246..1132f308 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionSystem.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionSystem.java @@ -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 regionCache = new LinkedHashMap<>(16, 0.75f, true) { @Override @@ -43,13 +45,36 @@ public class DynamicRegionSystem implements RegionSystem { private static final Map regionMap = new HashMap<>(); private static final Map> 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 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 new file mode 100644 index 00000000..722e5ba7 --- /dev/null +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegion.java @@ -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 . + */ + +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! + } +} diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/RegionConstructor.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/RegionConstructorData.java similarity index 59% rename from BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/RegionConstructor.java rename to BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/RegionConstructorData.java index 2c0a2953..953f1c60 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/RegionConstructor.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/RegionConstructorData.java @@ -17,10 +17,22 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.region; +package de.steamwar.bausystem.region.dynamic; -public abstract class RegionConstructor { - 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 regionDataClass(); } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/global/GlobalRegionData.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/global/GlobalRegionData.java index 1a85c5d2..81ba2cad 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/global/GlobalRegionData.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/global/GlobalRegionData.java @@ -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); diff --git a/BauSystem/BauSystem_RegionDynamic2/src/de/steamwar/bausystem/region/DynamicRegionSystem.java b/BauSystem/BauSystem_RegionDynamic2/src/de/steamwar/bausystem/region/DynamicRegionSystem.java index f33fe915..75e0671f 100644 --- a/BauSystem/BauSystem_RegionDynamic2/src/de/steamwar/bausystem/region/DynamicRegionSystem.java +++ b/BauSystem/BauSystem_RegionDynamic2/src/de/steamwar/bausystem/region/DynamicRegionSystem.java @@ -74,10 +74,6 @@ public class DynamicRegionSystem implements RegionSystem { regionMap.remove(region.getID()); } - @Override - public void save() { - } - @Override public @NonNull Location getWorldSpawn() { if (SpawnResetter.isBigSpawn()) { diff --git a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/FixedRegionSystem.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/FixedRegionSystem.java index 7b363d53..a5b8d2a1 100644 --- a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/FixedRegionSystem.java +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/FixedRegionSystem.java @@ -46,10 +46,6 @@ public class FixedRegionSystem implements RegionSystem { RegionLoader.load(); } - @Override - public void save() { - } - @Override public @NonNull Location getWorldSpawn() { Location spawnLocation = Bukkit.getWorlds().get(0).getSpawnLocation(); diff --git a/BauSystem/build.gradle.kts b/BauSystem/build.gradle.kts index d6fbd005..5a8b572d 100644 --- a/BauSystem/build.gradle.kts +++ b/BauSystem/build.gradle.kts @@ -40,3 +40,12 @@ tasks.register("DevBau21") { dependsOn(":SchematicSystem:shadowJar") template = "Bau21" } + +tasks.register("DevBau21Dynamic") { + group = "run" + description = "Run a 1.21 Dynamic Dev Bau" + dependsOn(":BauSystem:shadowJar") + dependsOn(":SchematicSystem:shadowJar") + template = "Bau21-Dynamic" + jar = "/jars/paper-1.21.6.jar" +}