From 14bd38f471537c83758728d94c9ba065a0370262 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Mon, 10 Nov 2025 16:57:06 +0100 Subject: [PATCH] Improve FlagStorage --- .../bausystem/region/FlagStorage.java | 66 +++++++++++++++-- .../steamwar/bausystem/region/RegionData.java | 1 + .../region/fixed/FixedFlagStorage.java | 64 +--------------- .../region/fixed/FixedGlobalFlagStorage.java | 73 +++---------------- .../bausystem/region/fixed/Prototype.java | 3 +- .../region/fixed/loader/RegionLoader.java | 2 +- 6 files changed, 76 insertions(+), 133 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/FlagStorage.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/FlagStorage.java index 5a706392..4b19d486 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/FlagStorage.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/FlagStorage.java @@ -21,23 +21,77 @@ package de.steamwar.bausystem.region; import de.steamwar.bausystem.region.flags.Flag; import lombok.NonNull; +import yapion.hierarchy.types.YAPIONObject; +import java.util.HashMap; import java.util.Map; -public interface FlagStorage { +public abstract class FlagStorage { + + protected final Map, Flag.Value> flagMap = new HashMap<>(); + protected final YAPIONObject data; + protected final Runnable onChange; + + protected FlagStorage(YAPIONObject data, Runnable onChange) { + this.data = data; + this.onChange = onChange; + initialize(); + for (final Flag flag : Flag.getFlags()) { + if (!has(flag).isWritable()) continue; + try { + String s = data.getPlainValue(flag.name()); + flagMap.put(flag, flag.valueOfValue(s)); + } catch (Exception e) { + flagMap.put(flag, (Flag.Value) flag.getDefaultValue()); + } + } + } + + protected void initialize() { + } @NonNull - & Flag.Value> RegionFlagPolicy has(@NonNull Flag flag); + public abstract & Flag.Value> RegionFlagPolicy has(@NonNull Flag flag); /** * Returns true if the flag was changed and did not already contain the provided value */ - & Flag.Value> boolean set(@NonNull Flag flag, @NonNull T value); + public final & Flag.Value> boolean set(@NonNull Flag flag, @NonNull T value) { + if (has(flag).isWritable()) { + boolean hasChanged = flagMap.put(flag, value) != value; + if (hasChanged) { + data.put(flag.name(), value.name()); + onChange.run(); + } + return hasChanged; + } else { + return false; + } + } @NonNull - & Flag.Value> FlagOptional get(@NonNull Flag flag); + public final & Flag.Value> FlagOptional get(@NonNull Flag flag) { + return FlagOptional.of(flag, (T) flagMap.get(flag)); + } - void clear(); + public final void clear() { + for (Flag flag : Flag.getFlags()) { + if (has(flag).isWritable()) { + flagMap.remove(flag); + data.remove(flag.name()); + } + } + onChange.run(); + } - Map, Flag.Value> getBackedMap(); + public final Map, Flag.Value> getBackedMap() { + return flagMap; + } + + @Override + public final String toString() { + return getClass().getSimpleName() + "{" + + "flagMap=" + flagMap + + '}'; + } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionData.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionData.java index e2f9d1a1..1f3949dd 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionData.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionData.java @@ -19,6 +19,7 @@ package de.steamwar.bausystem.region; +import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.sql.SchematicNode; import yapion.hierarchy.types.YAPIONObject; diff --git a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedFlagStorage.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedFlagStorage.java index c902f941..52b3b6ca 100644 --- a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedFlagStorage.java +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedFlagStorage.java @@ -19,34 +19,17 @@ package de.steamwar.bausystem.region.fixed; -import de.steamwar.bausystem.region.FlagOptional; import de.steamwar.bausystem.region.FlagStorage; import de.steamwar.bausystem.region.RegionFlagPolicy; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.core.Core; import lombok.NonNull; import yapion.hierarchy.types.YAPIONObject; -import java.util.HashMap; -import java.util.Map; +public class FixedFlagStorage extends FlagStorage { -public class FixedFlagStorage implements FlagStorage { - - private Map, Flag.Value> flagMap = new HashMap<>(); - private YAPIONObject data; - - public FixedFlagStorage(YAPIONObject data) { - this.data = data; - for (final Flag flag : Flag.getFlags()) { - if (!has(flag).isWritable()) continue; - try { - String s = data.getPlainValue(flag.name()); - flagMap.put(flag, flag.valueOfValue(s)); - } catch (Exception e) { - flagMap.put(flag, (Flag.Value) flag.getDefaultValue()); - } - } + public FixedFlagStorage(YAPIONObject data, Runnable onChange) { + super(data, onChange); } @Override @@ -62,45 +45,4 @@ public class FixedFlagStorage implements FlagStorage { } return RegionFlagPolicy.NOT_APPLICABLE; } - - @Override - public & Flag.Value> boolean set(@NonNull Flag flag, @NonNull T value) { - if (has(flag).isWritable()) { - boolean hasChanged = flagMap.put(flag, value) != value; - if (hasChanged) { - data.put(flag.name(), value.name()); - WorldData.write(); - } - return hasChanged; - } else { - return false; - } - } - - @Override - public @NonNull & Flag.Value> FlagOptional get(@NonNull Flag flag) { - return FlagOptional.of(flag, (T) flagMap.get(flag)); - } - - @Override - public void clear() { - for (Flag flag : Flag.getFlags()) { - if (flag == Flag.TESTBLOCK) continue; - if (flag == Flag.COLOR) continue; - if (flag == Flag.CHANGED) continue; - flagMap.remove(flag); - } - } - - @Override - public Map, Flag.Value> getBackedMap() { - return flagMap; - } - - @Override - public String toString() { - return "FixedFlagStorage{" + - "flagMap=" + flagMap + - '}'; - } } diff --git a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedGlobalFlagStorage.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedGlobalFlagStorage.java index 69766fee..576a550b 100644 --- a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedGlobalFlagStorage.java +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedGlobalFlagStorage.java @@ -19,43 +19,32 @@ package de.steamwar.bausystem.region.fixed; -import de.steamwar.bausystem.region.FlagOptional; import de.steamwar.bausystem.region.FlagStorage; import de.steamwar.bausystem.region.RegionFlagPolicy; import de.steamwar.bausystem.region.flags.ColorMode; import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.bausystem.region.flags.ProtectMode; import de.steamwar.bausystem.region.flags.TNTMode; -import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.core.Core; import lombok.NonNull; import yapion.hierarchy.types.YAPIONObject; -import java.util.HashMap; -import java.util.Map; +public class FixedGlobalFlagStorage extends FlagStorage { -public class FixedGlobalFlagStorage implements FlagStorage { + public FixedGlobalFlagStorage(YAPIONObject data, Runnable onChange) { + super(data, onChange); + } - private Map, Flag.Value> flagMap = new HashMap<>(); - private YAPIONObject data; - - public FixedGlobalFlagStorage(YAPIONObject data) { + @Override + protected void initialize() { flagMap.put(Flag.TNT, TNTMode.DENY); - this.data = data; - for (final Flag flag : Flag.getFlags()) { - if (!has(flag).isWritable()) continue; - try { - String s = data.getPlainValue(flag.name()); - flagMap.put(flag, flag.valueOfValue(s)); - } catch (Exception e) { - flagMap.put(flag, (Flag.Value) flag.getDefaultValue()); - } - } + flagMap.put(Flag.COLOR, ColorMode.YELLOW); + flagMap.put(Flag.PROTECT, ProtectMode.INACTIVE); } @Override public @NonNull & Flag.Value> RegionFlagPolicy has(@NonNull Flag flag) { - if (flag.oneOf(Flag.COLOR)) { + if (flag.oneOf(Flag.COLOR, Flag.PROTECT)) { return RegionFlagPolicy.READ_ONLY; } if (flag.oneOf(Flag.ITEMS) && Core.getVersion() >= 20) { @@ -66,48 +55,4 @@ public class FixedGlobalFlagStorage implements FlagStorage { } return RegionFlagPolicy.NOT_APPLICABLE; } - - @Override - public & Flag.Value> boolean set(@NonNull Flag flag, @NonNull T value) { - if (has(flag).isWritable()) { - data.put(flag.name(), value.name()); - WorldData.write(); - return flagMap.put(flag, value) != value; - } else { - return false; - } - } - - @Override - public @NonNull & Flag.Value> FlagOptional get(@NonNull Flag flag) { - if (flag.oneOf(Flag.COLOR)) { - return FlagOptional.of((Flag) flag, ColorMode.YELLOW); - } - if (flag.oneOf(Flag.PROTECT)) { - return FlagOptional.of((Flag) flag, ProtectMode.INACTIVE); - } - return FlagOptional.of(flag, (T) flagMap.get(flag)); - } - - @Override - public void clear() { - for (Flag flag : Flag.getFlags()) { - if (flag == Flag.TESTBLOCK) continue; - if (flag == Flag.COLOR) continue; - if (flag == Flag.CHANGED) continue; - flagMap.remove(flag); - } - } - - @Override - public Map, Flag.Value> getBackedMap() { - return flagMap; - } - - @Override - public String toString() { - return "FixedGlobalFlagStorage{" + - "flagMap=" + flagMap + - '}'; - } } diff --git a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/Prototype.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/Prototype.java index 948ab301..1f035241 100644 --- a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/Prototype.java +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/Prototype.java @@ -20,6 +20,7 @@ package de.steamwar.bausystem.region.fixed; import de.steamwar.bausystem.region.FixedRegionSystem; +import de.steamwar.bausystem.worlddata.WorldData; import lombok.AllArgsConstructor; import lombok.Getter; import yapion.hierarchy.types.YAPIONObject; @@ -216,7 +217,7 @@ public class Prototype { } else { prototype = PROTOTYPE_MAP.get(regionConfig.getPlainValue("prototype")); } - FixedFlagStorage flagStorage = new FixedFlagStorage(regionData.getObjectOrSetDefault("flagStorage", new YAPIONObject())); + FixedFlagStorage flagStorage = new FixedFlagStorage(regionData.getObjectOrSetDefault("flagStorage", new YAPIONObject()), WorldData::write); FixedRegionSystem.addRegion(new FixedRegion(name, flagStorage, prototype, regionConfig, regionData)); } } diff --git a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/RegionLoader.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/RegionLoader.java index 98967789..e5bfd84e 100644 --- a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/RegionLoader.java +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/RegionLoader.java @@ -80,6 +80,6 @@ public class RegionLoader { globalOptions = new YAPIONObject(); optionsYapionObject.add("global", globalOptions); } - FixedGlobalRegion.setFLAG_STORAGE(new FixedGlobalFlagStorage(globalOptions.getObjectOrSetDefault("flagStorage", new YAPIONObject()))); + FixedGlobalRegion.setFLAG_STORAGE(new FixedGlobalFlagStorage(globalOptions.getObjectOrSetDefault("flagStorage", new YAPIONObject()), WorldData::write)); } }