forked from SteamWar/SteamWar
Improve FlagStorage
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user