Improve FlagStorage

This commit is contained in:
2025-11-10 16:57:06 +01:00
parent c107b741c0
commit 14bd38f471
6 changed files with 76 additions and 133 deletions
@@ -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<?>, 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
<T extends Enum<T> & Flag.Value<T>> RegionFlagPolicy has(@NonNull Flag<T> flag);
public abstract <T extends Enum<T> & Flag.Value<T>> RegionFlagPolicy has(@NonNull Flag<T> flag);
/**
* Returns true if the flag was changed and did not already contain the provided value
*/
<T extends Enum<T> & Flag.Value<T>> boolean set(@NonNull Flag<T> flag, @NonNull T value);
public final <T extends Enum<T> & Flag.Value<T>> boolean set(@NonNull Flag<T> 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
<T extends Enum<T> & Flag.Value<T>> FlagOptional<T> get(@NonNull Flag<T> flag);
public final <T extends Enum<T> & Flag.Value<T>> FlagOptional<T> get(@NonNull Flag<T> 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<?>, Flag.Value<?>> getBackedMap();
public final Map<Flag<?>, Flag.Value<?>> getBackedMap() {
return flagMap;
}
@Override
public final String toString() {
return getClass().getSimpleName() + "{" +
"flagMap=" + flagMap +
'}';
}
}
@@ -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;