From 0e8c48f5703dd22d985d5e1bf9d223cc8be5b610 Mon Sep 17 00:00:00 2001 From: kento2 Date: Tue, 1 Sep 2026 01:43:45 +0200 Subject: [PATCH] . --- .../convention/ScrowMessageStyle.java | 5 +- .../configurator/ConfiguratorPlugin.java | 16 ---- .../scrow/configurator/action/SetAction.java | 40 +++++++++ .../configurator/command/CheckLiteral.java | 4 +- .../configurator/command/ConfigLiteral.java | 2 +- .../configurator/command/KeyLiteral.java | 4 +- .../configurator/configfile/ConfigFile.java | 51 +++++++++--- .../configfile/ConfigFileImpl.java | 83 ------------------- .../configfile/ConfigFileRegistry.java | 19 ++--- .../storable/AbstractStorable.java | 51 +++++++++--- .../configurator/storable/MapStorable.java | 4 + .../scrow/configurator/storable/Storable.java | 8 +- .../storable/WrappedStorable.java | 12 +-- .../storable/complex/ComplexStorable.java | 19 ++--- .../storable/complex/FieldRegistry.java | 10 +++ .../storable/complex/SubFieldedStorable.java | 45 +--------- .../storable/impl/DurationStorable.java | 2 +- .../storable/impl/VectorStorable.java | 2 +- .../ComponentStorable.java} | 11 ++- .../impl/component/SetComponentAction.java | 21 +++++ .../impl/location/LocationStorable.java | 26 ++---- .../storable/impl/world/SetWorldAction.java | 31 ++----- .../storable/impl/world/WorldStorable.java | 6 +- .../storable/list/ListStorable.java | 50 +++++++---- .../storable/primitive/BooleanStorable.java | 8 +- .../storable/primitive/ByteStorable.java | 8 +- .../storable/primitive/DoubleStorable.java | 8 +- .../storable/primitive/FloatStorable.java | 8 +- .../storable/primitive/IntStorable.java | 7 +- .../storable/primitive/LongStorable.java | 8 +- .../storable/primitive/PrimitiveStorable.java | 18 +--- .../storable/primitive/StringStorable.java | 16 +++- .../scrow/extraction/ExtractionPlugin.java | 5 +- .../scrow/extraction/config/ArenaConfig.java | 4 + .../config/ArenaConfigStorable.java | 13 +-- .../extraction/config/ExtractionConfig.java | 41 ++++----- .../config/ExtractionConfigStorable.java | 29 +++++++ .../extractionpoint/ExtractionPoint.java | 1 + .../extractionpoint/ExtractionProgress.java | 10 +-- 39 files changed, 379 insertions(+), 327 deletions(-) create mode 100644 core/configurator/main/java/site/lab0x13/scrow/configurator/action/SetAction.java delete mode 100644 core/configurator/main/java/site/lab0x13/scrow/configurator/configfile/ConfigFileImpl.java rename core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/{MiniMessageStorable.java => component/ComponentStorable.java} (55%) create mode 100644 core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/component/SetComponentAction.java create mode 100644 minigame/extraction/site/lab0x13/scrow/extraction/config/ExtractionConfigStorable.java diff --git a/core/common/src/main/java/de/kentoj/scrowlib/convention/ScrowMessageStyle.java b/core/common/src/main/java/de/kentoj/scrowlib/convention/ScrowMessageStyle.java index e58b376..052f13a 100644 --- a/core/common/src/main/java/de/kentoj/scrowlib/convention/ScrowMessageStyle.java +++ b/core/common/src/main/java/de/kentoj/scrowlib/convention/ScrowMessageStyle.java @@ -21,8 +21,9 @@ public record ScrowMessageStyle( @Override public Component ok(Component msg) { - return ComponentUtils.resolveURLS(prefix.append(Component.text(" ☆ ").color(NamedTextColor.GRAY)) - .append(msg.colorIfAbsent(NamedTextColor.GRAY))); + return ComponentUtils.resolveURLS( + prefix.append(Component.text(" ☆ ").color(NamedTextColor.GRAY)) + .append(msg.colorIfAbsent(NamedTextColor.GRAY))); } @Override diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/ConfiguratorPlugin.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/ConfiguratorPlugin.java index 5021959..af9ada3 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/ConfiguratorPlugin.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/ConfiguratorPlugin.java @@ -5,10 +5,7 @@ import org.bukkit.plugin.java.JavaPlugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import site.lab0x13.scrow.configurator.command.ConfiguratorCommand; -import site.lab0x13.scrow.configurator.configfile.ConfigFile; import site.lab0x13.scrow.configurator.configfile.ConfigFileRegistry; -import site.lab0x13.scrow.configurator.storable.impl.VectorStorable; -import site.lab0x13.scrow.configurator.storable.impl.location.LocationStorable; import java.io.IOException; @@ -18,19 +15,6 @@ public class ConfiguratorPlugin extends JavaPlugin { @Override public void onEnable() { - ConfigFile hotPotatoConfig = ConfigFile.of(this.getDataPath().resolve("config.json")); - ConfigFileRegistry.get().register(hotPotatoConfig); - - var someVector = new VectorStorable(); - var someLocation = new LocationStorable(); - hotPotatoConfig.registerStorable("someVector", someVector); - hotPotatoConfig.registerStorable("someLocation", someLocation); - - try { - hotPotatoConfig.load(); - } catch (IOException e) { - throw new RuntimeException(e); - } ScrowAPI.commands().register(ConfiguratorCommand.rootLiteral(ConfigFileRegistry.get())); } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/action/SetAction.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/action/SetAction.java new file mode 100644 index 0000000..5450811 --- /dev/null +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/action/SetAction.java @@ -0,0 +1,40 @@ +package site.lab0x13.scrow.configurator.action; + +import de.kentoj.scrow.bukkit.command.ScrowBukkitCC; +import net.kyori.adventure.text.Component; +import org.jetbrains.annotations.Nullable; +import site.lab0x13.scrow.commands.model.argument.Argument; +import site.lab0x13.scrow.configurator.storable.Storable; + +import java.util.List; + +public abstract class SetAction implements StorableAction> { + + private final Argument argument = argument(); + protected abstract Argument argument(); + protected abstract @Nullable Component valueToPrettyString(T value); + + @Override + public String name() { + return "set"; + } + + @Override + public List> arguments(Storable __) { + return List.of(argument); + } + + @Override + public boolean requiresValue() { + return false; + } + + @Override + public void execute(Storable storable, ScrowBukkitCC ctx) { + var parsedArg = ctx.getArgument(argument); + storable.value(parsedArg.value()); + var prettyValue = valueToPrettyString(parsedArg.value()); + var valueAsString = prettyValue != null ? prettyValue : Component.text(parsedArg.rawValue()); + ctx.sender().sendMessage(ctx.style().ok("Set value to ").append(valueAsString)); + } +} diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/command/CheckLiteral.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/command/CheckLiteral.java index c378c45..efeee3b 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/command/CheckLiteral.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/command/CheckLiteral.java @@ -11,9 +11,9 @@ import static java.util.Objects.*; final class CheckLiteral { private final Literal literal; - private final ConfigFile configFile; + private final ConfigFile configFile; - public CheckLiteral(ConfigFile configFile) { + public CheckLiteral(ConfigFile configFile) { this.configFile = configFile; this.literal = Literal.builder("check") .withSyncExecutor(this::execute) diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/command/ConfigLiteral.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/command/ConfigLiteral.java index 7d89c56..ede6267 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/command/ConfigLiteral.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/command/ConfigLiteral.java @@ -8,7 +8,7 @@ public final class ConfigLiteral { private ConfigLiteral() { } - public static Literal literal(ConfigFile cfg) { + public static Literal literal(ConfigFile cfg) { return Literal.builder(cfg.path().normalize().toString()) .withSubLiteral(new KeyLiteral(cfg).literal()) .withSubLiteral(new CheckLiteral(cfg).literal()) diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/command/KeyLiteral.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/command/KeyLiteral.java index 7f39a0c..bed26da 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/command/KeyLiteral.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/command/KeyLiteral.java @@ -11,9 +11,9 @@ import site.lab0x13.scrow.configurator.action.StorableAction; final class KeyLiteral { private final Literal literal; - private final ConfigFile configFile; + private final ConfigFile configFile; - KeyLiteral(ConfigFile configFile) { + KeyLiteral(ConfigFile configFile) { this.configFile = configFile; literal = Literal.dynamic("key") .withSubLiteralMetas(() -> configFile.allKeys().stream().map(LiteralMeta::of).toList()) diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/configfile/ConfigFile.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/configfile/ConfigFile.java index fad2e60..f92d1e4 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/configfile/ConfigFile.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/configfile/ConfigFile.java @@ -1,28 +1,59 @@ package site.lab0x13.scrow.configurator.configfile; +import com.google.gson.JsonParser; import org.jetbrains.annotations.Nullable; import site.lab0x13.scrow.configurator.storable.Storable; +import site.lab0x13.scrow.configurator.storable.complex.ComplexStorable; import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.List; -import java.util.Map; -public interface ConfigFile extends Storable>> { +import static java.util.Objects.requireNonNull; - static ConfigFile of(Path path) { - return new ConfigFileImpl(path.normalize()); +public abstract class ConfigFile extends ComplexStorable { + + private final Path path; + + public ConfigFile(Path path) { + this.path = path; } - @Nullable Storable getStorable(String key); + public void load() throws IOException { + this.loadJson(JsonParser.parseString(Files.readString(path))); + } - void registerStorable(String key, Storable storable); + public void save() throws IOException { + Files.writeString(path, this.toJson().toString()); + } - List allKeys(); + public Storable getStorable(String key) { + Storable cur = this; + for (var fieldName : key.split("\\.")) { + cur = cur.getSubField(fieldName); + if (cur == null) return null; + } + return cur; + } - void load() throws IOException; + public List allKeys() { + var res = new ArrayList(); + addKeysRecursively(res, null, this); + return res; + } - void save() throws IOException; + private void addKeysRecursively(List res, @Nullable String parentKey, Storable storable) { + if (parentKey != null) + res.add(parentKey); + storable.subFieldNames().forEach(subFieldName -> { + var subKey = parentKey == null ? subFieldName : parentKey + "." + subFieldName; + addKeysRecursively(res, subKey, requireNonNull(storable.getSubField(subFieldName))); + }); + } - Path path(); + public Path path() { + return path; + } } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/configfile/ConfigFileImpl.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/configfile/ConfigFileImpl.java deleted file mode 100644 index a743780..0000000 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/configfile/ConfigFileImpl.java +++ /dev/null @@ -1,83 +0,0 @@ -package site.lab0x13.scrow.configurator.configfile; - -import com.google.gson.JsonParser; -import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import site.lab0x13.scrow.configurator.storable.MapStorable; -import site.lab0x13.scrow.configurator.storable.Storable; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -import static java.util.Objects.requireNonNull; - -class ConfigFileImpl extends MapStorable> implements ConfigFile { - - private static final Logger log = LoggerFactory.getLogger(ConfigFileImpl.class); - private final Path path; - - ConfigFileImpl(Path path) { - this.path = path; - } - - @Override - public @Nullable Storable getStorable(String key) { - var index = key.indexOf(':'); - if (index == -1) - return getSubField(key); - if (key.endsWith(":")) - return null; - - var fieldName = key.substring(0, index); - Storable storable = getSubField(fieldName); - if (storable == null) - return null; - for (String subFieldName : key.substring(index + 1).split(":")) { - if (subFieldName.isEmpty()) continue; - storable = storable.getSubField(subFieldName); - if (storable == null) - return null; - } - return storable; - } - - @Override - public void registerStorable(String key, Storable storable) { - registerEntry(key, (Storable) storable); - } - - @Override - public List allKeys() { - var res = new ArrayList(); - subFieldNames().forEach(key -> addKeysRecursively(res, key, requireNonNull(getSubField(key)))); - return res; - } - - private void addKeysRecursively(List result, String key, Storable storable) { - result.add(key); - storable.subFieldNames().forEach(subKey -> - addKeysRecursively(result, key + ":" + subKey, requireNonNull(storable.getSubField(subKey)))); - } - - @Override - public void load() throws IOException { - if (!Files.exists(this.path)) return; - var json = Files.readString(this.path()); - this.loadJson(JsonParser.parseString(json)); - } - - @Override - public void save() throws IOException { - Files.createDirectories(this.path().getParent()); - Files.writeString(this.path(), this.toJson().toString()); - } - - @Override - public Path path() { - return path; - } -} diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/configfile/ConfigFileRegistry.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/configfile/ConfigFileRegistry.java index eca8096..59b980c 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/configfile/ConfigFileRegistry.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/configfile/ConfigFileRegistry.java @@ -1,34 +1,33 @@ package site.lab0x13.scrow.configurator.configfile; import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; public class ConfigFileRegistry { - private static final Logger log = LoggerFactory.getLogger(ConfigFileRegistry.class); private static final ConfigFileRegistry instance = new ConfigFileRegistry(); public static ConfigFileRegistry get() { return instance; } - private final Map configFiles = new HashMap<>(); + private final Map> configFiles = new HashMap<>(); - public void register(ConfigFile configFile) { - var oldValue = configFiles.put(configFile.path().toString(), configFile); - if (oldValue != null) - log.warn("Overwriting old config with same path '{}'", configFile.path()); + private ConfigFileRegistry() { } - public Map allConfigs() { + public void register(ConfigFile configFile, S defaultValue) { + configFile.value(defaultValue); + configFiles.put(configFile.path().normalize().toString(), configFile); + } + + public Map> allConfigs() { return new HashMap<>(configFiles); } - public @Nullable ConfigFile getConfigFile(String path) { + public @Nullable ConfigFile getConfigFile(String path) { return configFiles.get(path); } } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/AbstractStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/AbstractStorable.java index be5dc5f..4211805 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/AbstractStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/AbstractStorable.java @@ -1,36 +1,46 @@ package site.lab0x13.scrow.configurator.storable; +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; import org.jetbrains.annotations.Nullable; +import site.lab0x13.scrow.configurator.action.StorableAction; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; -import java.util.function.Supplier; public abstract class AbstractStorable implements Storable { private final List subscribers = new ArrayList<>(); - private final Supplier defaultValue; - protected T value = null; - + private final List> actions = new ArrayList<>(); private final List> requirements = new ArrayList<>(); + private @Nullable T value = null; - protected AbstractStorable(Supplier defaultValue) { - this.defaultValue = defaultValue; + public AbstractStorable() { + actions.addAll(Storable.super.actions()); } - protected AbstractStorable(T defaultValue) { - this(() -> defaultValue); - } + protected abstract JsonElement toJsonSafe(); + + protected abstract void loadJsonSafe(JsonElement json); protected void requireValue(Predicate predicate, String error) { requirements.add(new ValueRequirement<>(predicate, error)); } + protected void addAction(StorableAction action) { + actions.add(action); + } + @Override public void subscribe(ValueChangeSubscriber subscriber) { subscribers.add(subscriber); } + @Override + public List> actions() { + return actions; + } + @Override public @Nullable T value() { return value; @@ -38,10 +48,15 @@ public abstract class AbstractStorable implements Storable { @Override public void value(@Nullable T value) { - this.value = value != null ? value : defaultValue.get(); + setValueSilently(value); subscribers.forEach(ValueChangeSubscriber::notifyValueChange); } + @Override + public void setValueSilently(@Nullable T value) { + this.value = value; + } + @Override public @Nullable String checkValue() { for (var requirement : requirements) { @@ -50,4 +65,20 @@ public abstract class AbstractStorable implements Storable { } return null; } + + @Override + public void loadJson(JsonElement json) { + if (json == null || json.isJsonNull()) { + value(null); + return; + } + loadJsonSafe(json); + } + + @Override + public JsonElement toJson() { + if (value == null) + return JsonNull.INSTANCE; + return toJsonSafe(); + } } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/MapStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/MapStorable.java index f1b6204..40b2dca 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/MapStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/MapStorable.java @@ -9,6 +9,10 @@ import java.util.Map; public class MapStorable extends ComplexStorable> { + public MapStorable() { + value(new HashMap<>()); + } + public void registerEntry(String name, Storable storable) { fieldRegistry().registerField(name, storable, map -> (S) map.get(name)); } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/Storable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/Storable.java index 90354ca..fc56e83 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/Storable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/Storable.java @@ -2,12 +2,13 @@ package site.lab0x13.scrow.configurator.storable; import com.google.gson.JsonElement; import org.jetbrains.annotations.Nullable; -import site.lab0x13.scrow.configurator.action.StorableAction; import site.lab0x13.scrow.configurator.action.GlobalSetJsonAction; import site.lab0x13.scrow.configurator.action.GlobalShowAction; +import site.lab0x13.scrow.configurator.action.StorableAction; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; public interface Storable { @@ -15,6 +16,11 @@ public interface Storable { void value(@Nullable T value); + /** + * Set value without notifying subscribers + */ + void setValueSilently(@Nullable T value); + JsonElement toJson(); void loadJson(JsonElement json); diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/WrappedStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/WrappedStorable.java index 17cc467..c752083 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/WrappedStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/WrappedStorable.java @@ -4,15 +4,13 @@ import com.google.gson.JsonElement; import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.function.Supplier; public abstract class WrappedStorable extends AbstractStorable { private final Storable realStorable; private boolean skipUpdates = false; - public WrappedStorable(Storable realStorable, Supplier defaultValue) { - super(defaultValue); + public WrappedStorable(Storable realStorable) { this.realStorable = realStorable; realStorable.subscribe(() -> { if (realStorable.value() == null) @@ -22,10 +20,6 @@ public abstract class WrappedStorable extends AbstractStorable { }); } - public WrappedStorable(Storable realStorable, T defaultValue) { - this(realStorable, () -> defaultValue); - } - abstract protected T wrap(R real); abstract protected R unwrap(T value); @@ -44,12 +38,12 @@ public abstract class WrappedStorable extends AbstractStorable { } @Override - public JsonElement toJson() { + public JsonElement toJsonSafe() { return realStorable.toJson(); } @Override - public void loadJson(JsonElement json) { + public void loadJsonSafe(JsonElement json) { realStorable.loadJson(json); } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/complex/ComplexStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/complex/ComplexStorable.java index c31017d..767cb7c 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/complex/ComplexStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/complex/ComplexStorable.java @@ -6,12 +6,14 @@ import site.lab0x13.scrow.configurator.storable.Storable; public abstract class ComplexStorable extends SubFieldedStorable { - protected ComplexStorable(T defaultValue) { - super(defaultValue); + public ComplexStorable() { + this.registerFields(fieldRegistry()); } + protected abstract void registerFields(FieldRegistry registry); + @Override - public JsonElement toJson() { + public JsonElement toJsonSafe() { var obj = new JsonObject(); fieldRegistry().subFields().forEach((subFieldName, subField) -> { var v = (Storable) subField.storable(); @@ -21,14 +23,9 @@ public abstract class ComplexStorable extends SubFieldedStorable { } @Override - public void loadJson(JsonElement json) { - if (json == null) { - value(null); - return; - } + public void loadJsonSafe(JsonElement json) { var obj = json.getAsJsonObject(); - skipUpdates(() -> fieldRegistry().subFields().forEach((subFieldName, subField) -> - subField.storable().loadJson(obj.get(subFieldName)))); - updateValue(); + fieldRegistry().subFields().forEach((subFieldName, subField) -> + subField.storable().loadJson(obj.get(subFieldName))); } } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/complex/FieldRegistry.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/complex/FieldRegistry.java index aa052be..6d5d838 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/complex/FieldRegistry.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/complex/FieldRegistry.java @@ -2,6 +2,7 @@ package site.lab0x13.scrow.configurator.storable.complex; import org.jetbrains.annotations.Nullable; import site.lab0x13.scrow.configurator.storable.Storable; +import site.lab0x13.scrow.configurator.storable.list.ListStorable; import java.util.HashMap; import java.util.Map; @@ -9,10 +10,19 @@ import java.util.function.Function; public class FieldRegistry { + private final Storable parent; private final Map> subFields = new HashMap<>(); + private final Runnable onFieldRegister; + + public FieldRegistry(Storable parent, Runnable onFieldRegister) { + this.parent = parent; + this.onFieldRegister = onFieldRegister; + } public void registerField(String name, Storable storable, Function getter) { subFields.put(name, new Field<>(storable, getter)); + parent.subscribe(() -> storable.setValueSilently(getter.apply(parent.value()))); + storable.subscribe(onFieldRegister::run); } public Map> subFields() { diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/complex/SubFieldedStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/complex/SubFieldedStorable.java index f4f682f..c6e2ea7 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/complex/SubFieldedStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/complex/SubFieldedStorable.java @@ -2,57 +2,20 @@ package site.lab0x13.scrow.configurator.storable.complex; import org.jetbrains.annotations.Nullable; import site.lab0x13.scrow.configurator.storable.AbstractStorable; -import site.lab0x13.scrow.configurator.storable.Action; import site.lab0x13.scrow.configurator.storable.Storable; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; public abstract class SubFieldedStorable extends AbstractStorable { - private final FieldRegistry fieldRegistry = new FieldRegistry<>(); - private boolean skipUpdates = false; - - public SubFieldedStorable(T defaultValue) { - super(defaultValue); - this.registerFields(fieldRegistry); - fieldRegistry.subFields().values().forEach(f -> f.storable().subscribe(this::updateValue)); - } - - protected abstract void registerFields(FieldRegistry registry); + private final FieldRegistry fieldRegistry = new FieldRegistry<>(this, this::onFieldRegister); protected abstract T construct(FieldReader reader); - /** - * Run action without updating the value - */ - protected void skipUpdates(Action action) { - try { - skipUpdates = true; - action.apply(); - } finally { - skipUpdates = false; - } - } - - protected void updateValue() { - if (skipUpdates) - return; - super.value(construct(new FieldReader<>(fieldRegistry))); - } - - @Override - public void value(@Nullable T value) { - super.value(value); - if (value == null) { - // reset if null - skipUpdates(() -> fieldRegistry.subFields().values().forEach(f -> f.storable().value(null))); - } else { - skipUpdates(() -> fieldRegistry.subFields().values().forEach(_field -> { - var field = (Field) _field; - field.storable().value(field.getter().apply(value)); - })); - } + private void onFieldRegister() { + this.setValueSilently(construct(new FieldReader<>(fieldRegistry))); } @Override diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/DurationStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/DurationStorable.java index 6e0b9bc..3d6e231 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/DurationStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/DurationStorable.java @@ -8,7 +8,7 @@ import site.lab0x13.scrow.configurator.storable.primitive.LongStorable; import java.time.Duration; -public class DurationStorable extends ComplexStorable { +public final class DurationStorable extends ComplexStorable { @Override protected void registerFields(FieldRegistry registry) { diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/VectorStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/VectorStorable.java index 9ae25c0..b3c046c 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/VectorStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/VectorStorable.java @@ -6,7 +6,7 @@ import site.lab0x13.scrow.configurator.storable.complex.FieldReader; import site.lab0x13.scrow.configurator.storable.complex.FieldRegistry; import site.lab0x13.scrow.configurator.storable.primitive.DoubleStorable; -public class VectorStorable extends ComplexStorable { +public final class VectorStorable extends ComplexStorable { @Override protected void registerFields(FieldRegistry registry) { diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/MiniMessageStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/component/ComponentStorable.java similarity index 55% rename from core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/MiniMessageStorable.java rename to core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/component/ComponentStorable.java index e31d22c..2471a0b 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/MiniMessageStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/component/ComponentStorable.java @@ -1,16 +1,21 @@ -package site.lab0x13.scrow.configurator.storable.impl; +package site.lab0x13.scrow.configurator.storable.impl.component; +import de.kentoj.scrow.bukkit.command.ScrowBukkitCC; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import site.lab0x13.scrow.commands.model.argument.Argument; +import site.lab0x13.scrow.commands.model.argument.types.StringArgumentType; +import site.lab0x13.scrow.configurator.action.SetAction; import site.lab0x13.scrow.configurator.storable.WrappedStorable; import site.lab0x13.scrow.configurator.storable.primitive.StringStorable; -public class MiniMessageStorable extends WrappedStorable { +public final class ComponentStorable extends WrappedStorable { private static final MiniMessage miniMessage = MiniMessage.miniMessage(); - public MiniMessageStorable() { + public ComponentStorable() { super(new StringStorable()); + addAction(new SetComponentAction()); } @Override diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/component/SetComponentAction.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/component/SetComponentAction.java new file mode 100644 index 0000000..801f6e2 --- /dev/null +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/component/SetComponentAction.java @@ -0,0 +1,21 @@ +package site.lab0x13.scrow.configurator.storable.impl.component; + +import de.kentoj.scrow.bukkit.command.ScrowBukkitCC; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import site.lab0x13.scrow.commands.model.argument.Argument; +import site.lab0x13.scrow.commands.model.argument.types.StringArgumentType; +import site.lab0x13.scrow.configurator.action.SetAction; + +class SetComponentAction extends SetAction { + @Override + protected Argument argument() { + return Argument.builder("miniMessage", new StringArgumentType()) + .build(); + } + + @Override + protected Component valueToPrettyString(String value) { + return MiniMessage.miniMessage().deserialize(value); + } +} diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/location/LocationStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/location/LocationStorable.java index b6051b1..04a01ff 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/location/LocationStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/location/LocationStorable.java @@ -1,27 +1,18 @@ package site.lab0x13.scrow.configurator.storable.impl.location; import org.bukkit.Location; -import site.lab0x13.scrow.configurator.action.StorableAction; import site.lab0x13.scrow.configurator.storable.complex.ComplexStorable; -import site.lab0x13.scrow.configurator.storable.primitive.DoubleStorable; -import site.lab0x13.scrow.configurator.storable.primitive.FloatStorable; -import site.lab0x13.scrow.configurator.storable.primitive.PrimitiveStorable; import site.lab0x13.scrow.configurator.storable.complex.FieldReader; import site.lab0x13.scrow.configurator.storable.complex.FieldRegistry; import site.lab0x13.scrow.configurator.storable.impl.world.WorldStorable; +import site.lab0x13.scrow.configurator.storable.primitive.DoubleStorable; +import site.lab0x13.scrow.configurator.storable.primitive.FloatStorable; -import java.util.ArrayList; -import java.util.List; +public final class LocationStorable extends ComplexStorable { -public class LocationStorable extends ComplexStorable { - - private final List> actions; - - public LocationStorable(Location defaultValue) { - super(defaultValue); - actions = new ArrayList<>(super.actions()); - actions.add(new LocationPickCurrentAction()); - actions.add(new LocationTeleportAction()); + public LocationStorable() { + addAction(new LocationPickCurrentAction()); + addAction(new LocationTeleportAction()); } @Override @@ -34,11 +25,6 @@ public class LocationStorable extends ComplexStorable { registry.registerField("pitch", new FloatStorable(), Location::getPitch); } - @Override - public List> actions() { - return actions; - } - @Override protected Location construct(FieldReader reader) { return new Location( diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/world/SetWorldAction.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/world/SetWorldAction.java index a8494b0..a934b95 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/world/SetWorldAction.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/world/SetWorldAction.java @@ -1,38 +1,21 @@ package site.lab0x13.scrow.configurator.storable.impl.world; import de.kentoj.scrow.bukkit.command.ScrowBukkitCC; +import net.kyori.adventure.text.Component; import org.bukkit.World; import site.lab0x13.scrow.commands.bukkit.type.WorldArgumentType; import site.lab0x13.scrow.commands.model.argument.Argument; -import site.lab0x13.scrow.configurator.action.StorableAction; -import site.lab0x13.scrow.configurator.storable.Storable; +import site.lab0x13.scrow.configurator.action.SetAction; -import java.util.List; - -class SetWorldAction implements StorableAction> { - - private final Argument arg = - Argument.builder("world", new WorldArgumentType()).build(); +class SetWorldAction extends SetAction { @Override - public String name() { - return "set"; + protected Component valueToPrettyString(World value) { + return Component.text(value.getName() + "(" + value.getUID() + ")"); } @Override - public List> arguments(Storable __) { - return List.of(arg); - } - - @Override - public boolean requiresValue() { - return false; - } - - @Override - public void execute(Storable node, ScrowBukkitCC ctx) { - World world = ctx.getArg(arg); - node.value(world); - ctx.sender().sendMessage(ctx.style().ok("Set world to " + world.getName() + "(" + world.getUID() + ")")); + protected Argument argument() { + return Argument.builder("world", new WorldArgumentType()).build(); } } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/world/WorldStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/world/WorldStorable.java index 4890fe4..3ca4926 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/world/WorldStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/impl/world/WorldStorable.java @@ -9,12 +9,12 @@ import site.lab0x13.scrow.configurator.storable.primitive.StringStorable; import java.util.ArrayList; import java.util.List; -public class WorldStorable extends WrappedStorable { +public final class WorldStorable extends WrappedStorable { private final List> actions; - public WorldStorable(World defaultValue) { - super(new StringStorable(), defaultValue); + public WorldStorable() { + super(new StringStorable()); actions = new ArrayList<>(super.actions()); actions.add(new SetWorldAction()); } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/list/ListStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/list/ListStorable.java index 8e7503a..3b62ba7 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/list/ListStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/list/ListStorable.java @@ -2,7 +2,6 @@ package site.lab0x13.scrow.configurator.storable.list; import com.google.gson.JsonArray; import com.google.gson.JsonElement; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import site.lab0x13.scrow.configurator.action.StorableAction; import site.lab0x13.scrow.configurator.storable.AbstractStorable; @@ -13,22 +12,25 @@ import java.util.List; import java.util.function.Supplier; import java.util.stream.IntStream; -import static java.util.Objects.requireNonNull; - public class ListStorable extends AbstractStorable> { private final Supplier> newElementSupplier; private final List> actions; - - private final List> _value = new ArrayList<>(); + private final List> _value; public ListStorable(Supplier> newElementSupplier) { - super(new ArrayList<>()); this.newElementSupplier = newElementSupplier; + _value = new ArrayList<>(); + value(new ArrayList<>()); actions = super.actions(); actions.add(new ListExpandAction<>()); } + @Override + public void value(@Nullable List value) { + super.value(value != null ? value : new ArrayList<>()); + } + @Override public List> actions() { return actions; @@ -39,26 +41,34 @@ public class ListStorable extends AbstractStorable> { */ public Storable expandList() { var newElement = newElementSupplier.get(); - newElement.subscribe(() -> value(_value.stream().map(Storable::value).toList())); + newElement.subscribe(this::updateValue); _value.add(newElement); + updateValue(); return newElement; } + public void deleteAt(int index) { + _value.remove(index); + updateValue(); + } + @Override - public JsonElement toJson() { + public JsonElement toJsonSafe() { var out = new JsonArray(); _value.forEach(storable -> out.add(storable.toJson())); return out; } @Override - public void loadJson(JsonElement json) { - if (json == null) { - _value.clear(); - return; - } + public void loadJsonSafe(JsonElement json) { var in = json.getAsJsonArray(); - in.forEach(jsonElement -> expandList().loadJson(jsonElement)); + _value.clear(); + in.forEach(jsonElement -> { + var element = newElementSupplier.get(); + element.loadJson(jsonElement); + _value.add(element); + }); + updateValue(); } @Override @@ -70,6 +80,16 @@ public class ListStorable extends AbstractStorable> { @Override public @Nullable Storable getSubField(String name) { - return _value.get(Integer.parseInt(name)); + int index; + try { + index = Integer.parseInt(name); + } catch (NumberFormatException _) { + return null; + } + return _value.get(index); + } + + private void updateValue() { + setValueSilently(_value.stream().map(Storable::value).toList()); } } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/BooleanStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/BooleanStorable.java index 3261450..bf00e74 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/BooleanStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/BooleanStorable.java @@ -2,9 +2,13 @@ package site.lab0x13.scrow.configurator.storable.primitive; import com.google.gson.JsonPrimitive; -public class BooleanStorable extends PrimitiveStorable{ +public final class BooleanStorable extends PrimitiveStorable{ + public BooleanStorable(boolean defaultValue) { + super(defaultValue, JsonPrimitive::new, JsonPrimitive::getAsBoolean); + } + public BooleanStorable() { - super(false, JsonPrimitive::new, JsonPrimitive::getAsBoolean); + this(false); } } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/ByteStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/ByteStorable.java index e0da049..c6e3b19 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/ByteStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/ByteStorable.java @@ -2,9 +2,13 @@ package site.lab0x13.scrow.configurator.storable.primitive; import com.google.gson.JsonPrimitive; -public class ByteStorable extends PrimitiveStorable{ +public final class ByteStorable extends PrimitiveStorable{ + public ByteStorable(byte defaultValue) { + super(defaultValue, JsonPrimitive::new, JsonPrimitive::getAsByte); + } + public ByteStorable() { - super((byte)0, JsonPrimitive::new, JsonPrimitive::getAsByte); + this((byte) 0); } } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/DoubleStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/DoubleStorable.java index 34d197d..fd31786 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/DoubleStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/DoubleStorable.java @@ -2,9 +2,13 @@ package site.lab0x13.scrow.configurator.storable.primitive; import com.google.gson.JsonPrimitive; -public class DoubleStorable extends PrimitiveStorable{ +public final class DoubleStorable extends PrimitiveStorable{ + public DoubleStorable(double defaultValue) { + super(defaultValue, JsonPrimitive::new, JsonPrimitive::getAsDouble); + } + public DoubleStorable() { - super(0D, JsonPrimitive::new, JsonPrimitive::getAsDouble); + this(0); } } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/FloatStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/FloatStorable.java index 81353b2..069d615 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/FloatStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/FloatStorable.java @@ -2,9 +2,13 @@ package site.lab0x13.scrow.configurator.storable.primitive; import com.google.gson.JsonPrimitive; -public class FloatStorable extends PrimitiveStorable{ +public final class FloatStorable extends PrimitiveStorable{ + public FloatStorable(float defaultValue) { + super(defaultValue, JsonPrimitive::new, JsonPrimitive::getAsFloat); + } + public FloatStorable() { - super(0F, JsonPrimitive::new, JsonPrimitive::getAsFloat); + this(0); } } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/IntStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/IntStorable.java index dd54121..0d98135 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/IntStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/IntStorable.java @@ -2,9 +2,12 @@ package site.lab0x13.scrow.configurator.storable.primitive; import com.google.gson.JsonPrimitive; -public class IntStorable extends PrimitiveStorable{ +public final class IntStorable extends PrimitiveStorable{ + public IntStorable(int defaultValue) { + super(defaultValue, JsonPrimitive::new, JsonPrimitive::getAsInt); + } public IntStorable() { - super(0, JsonPrimitive::new, JsonPrimitive::getAsInt); + this(0); } } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/LongStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/LongStorable.java index 141169e..71df75e 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/LongStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/LongStorable.java @@ -2,9 +2,13 @@ package site.lab0x13.scrow.configurator.storable.primitive; import com.google.gson.JsonPrimitive; -public class LongStorable extends PrimitiveStorable { +public final class LongStorable extends PrimitiveStorable { + public LongStorable(long defaultValue) { + super(defaultValue, JsonPrimitive::new, JsonPrimitive::getAsLong); + } + public LongStorable() { - super(0L, JsonPrimitive::new, JsonPrimitive::getAsLong); + this(0); } } diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/PrimitiveStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/PrimitiveStorable.java index dd3512e..013a749 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/PrimitiveStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/PrimitiveStorable.java @@ -13,9 +13,9 @@ import java.util.function.Function; public class PrimitiveStorable extends AbstractStorable { - private final V defaultValue; private final Function serializer; private final Function deserializer; + private final V defaultValue; public PrimitiveStorable(V defaultValue, Function serializer, Function deserializer) { this.defaultValue = defaultValue; @@ -24,23 +24,13 @@ public class PrimitiveStorable extends AbstractStorable { } @Override - public JsonElement toJson() { - if (value() == null) - return JsonNull.INSTANCE; + public JsonElement toJsonSafe() { return serializer.apply(value()); } @Override - public void loadJson(JsonElement json) { - if (json == null || json.isJsonNull()) - value(defaultValue); - else - value(deserializer.apply(json.getAsJsonPrimitive())); - } - - @Override - public void value(@Nullable V value) { - super.value(value == null ? defaultValue : value); + public void loadJsonSafe(JsonElement json) { + value(deserializer.apply(json.getAsJsonPrimitive())); } @Override diff --git a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/StringStorable.java b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/StringStorable.java index 0fdb8a5..8b9a9de 100644 --- a/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/StringStorable.java +++ b/core/configurator/main/java/site/lab0x13/scrow/configurator/storable/primitive/StringStorable.java @@ -1,10 +1,22 @@ package site.lab0x13.scrow.configurator.storable.primitive; import com.google.gson.JsonPrimitive; +import site.lab0x13.scrow.configurator.action.StorableAction; + +import java.util.List; + +public final class StringStorable extends PrimitiveStorable{ + public StringStorable(String defaultValue) { + super(defaultValue, JsonPrimitive::new, JsonPrimitive::getAsString); + } -public class StringStorable extends PrimitiveStorable{ public StringStorable() { - super("", JsonPrimitive::new, JsonPrimitive::getAsString); + this(""); + } + + @Override + public List> actions() { + return super.actions(); } } diff --git a/minigame/extraction/site/lab0x13/scrow/extraction/ExtractionPlugin.java b/minigame/extraction/site/lab0x13/scrow/extraction/ExtractionPlugin.java index ed109c7..457e4d8 100644 --- a/minigame/extraction/site/lab0x13/scrow/extraction/ExtractionPlugin.java +++ b/minigame/extraction/site/lab0x13/scrow/extraction/ExtractionPlugin.java @@ -4,7 +4,9 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import site.lab0x13.scrow.configurator.configfile.ConfigFileRegistry; import site.lab0x13.scrow.extraction.config.ExtractionConfig; +import site.lab0x13.scrow.extraction.config.ExtractionConfigStorable; public class ExtractionPlugin extends JavaPlugin { @@ -18,6 +20,7 @@ public class ExtractionPlugin extends JavaPlugin { @Override public void onEnable() { _plugin = this; - ExtractionConfig.registerAndLoad(this); + var config = new ExtractionConfigStorable(this.getDataPath().resolve("config.json")); + ConfigFileRegistry.get().register(config, ExtractionConfig.defaultConfig()); } } \ No newline at end of file diff --git a/minigame/extraction/site/lab0x13/scrow/extraction/config/ArenaConfig.java b/minigame/extraction/site/lab0x13/scrow/extraction/config/ArenaConfig.java index ab98810..e568b2f 100644 --- a/minigame/extraction/site/lab0x13/scrow/extraction/config/ArenaConfig.java +++ b/minigame/extraction/site/lab0x13/scrow/extraction/config/ArenaConfig.java @@ -4,6 +4,7 @@ import net.kyori.adventure.text.Component; import org.bukkit.Location; import site.lab0x13.scrow.extraction.extractionpoint.ExtractionPoint; +import java.util.ArrayList; import java.util.List; public record ArenaConfig( @@ -12,4 +13,7 @@ public record ArenaConfig( List spawnLocations, List extractionPoints ) { + public static ArenaConfig defaultConfig() { + return new ArenaConfig("", Component.empty(), new ArrayList<>(), new ArrayList<>()); + } } diff --git a/minigame/extraction/site/lab0x13/scrow/extraction/config/ArenaConfigStorable.java b/minigame/extraction/site/lab0x13/scrow/extraction/config/ArenaConfigStorable.java index a70f0e7..8f84720 100644 --- a/minigame/extraction/site/lab0x13/scrow/extraction/config/ArenaConfigStorable.java +++ b/minigame/extraction/site/lab0x13/scrow/extraction/config/ArenaConfigStorable.java @@ -3,9 +3,9 @@ package site.lab0x13.scrow.extraction.config; import site.lab0x13.scrow.configurator.storable.complex.ComplexStorable; import site.lab0x13.scrow.configurator.storable.complex.FieldReader; import site.lab0x13.scrow.configurator.storable.complex.FieldRegistry; -import site.lab0x13.scrow.configurator.storable.impl.MiniMessageStorable; -import site.lab0x13.scrow.configurator.storable.list.ListStorable; +import site.lab0x13.scrow.configurator.storable.impl.component.ComponentStorable; import site.lab0x13.scrow.configurator.storable.impl.location.LocationStorable; +import site.lab0x13.scrow.configurator.storable.list.ListStorable; import site.lab0x13.scrow.configurator.storable.primitive.StringStorable; public class ArenaConfigStorable extends ComplexStorable { @@ -13,9 +13,12 @@ public class ArenaConfigStorable extends ComplexStorable { @Override protected void registerFields(FieldRegistry registry) { registry.registerField("id", new StringStorable(), ArenaConfig::id); - registry.registerField("name", new MiniMessageStorable(), ArenaConfig::name); - registry.registerField("spawnLocations", new ListStorable<>(LocationStorable::new), ArenaConfig::spawnLocations); - registry.registerField("extractionPoints", new ListStorable<>(ExtractionPointStorable::new), ArenaConfig::extractionPoints); + registry.registerField("name", new ComponentStorable(), ArenaConfig::name); + registry.registerField("spawnLocations", + new ListStorable<>(LocationStorable::new), ArenaConfig::spawnLocations); + registry.registerField("extractionPoints", + new ListStorable<>(ExtractionPointStorable::new), + ArenaConfig::extractionPoints); } @Override diff --git a/minigame/extraction/site/lab0x13/scrow/extraction/config/ExtractionConfig.java b/minigame/extraction/site/lab0x13/scrow/extraction/config/ExtractionConfig.java index 95a254b..8a7cae9 100644 --- a/minigame/extraction/site/lab0x13/scrow/extraction/config/ExtractionConfig.java +++ b/minigame/extraction/site/lab0x13/scrow/extraction/config/ExtractionConfig.java @@ -1,32 +1,27 @@ package site.lab0x13.scrow.extraction.config; -import org.bukkit.plugin.Plugin; -import org.jetbrains.annotations.ApiStatus; -import site.lab0x13.scrow.configurator.configfile.ConfigFile; -import site.lab0x13.scrow.configurator.configfile.ConfigFileRegistry; -import site.lab0x13.scrow.configurator.storable.impl.DurationStorable; -import site.lab0x13.scrow.configurator.storable.list.ListStorable; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; -import java.io.IOException; +public record ExtractionConfig( + List arenas, + Duration extractionDuration +) { + private static ExtractionConfig instance; -public final class ExtractionConfig { - private ExtractionConfig() { + public static ExtractionConfig defaultConfig() { + return new ExtractionConfig( + new ArrayList<>(), + Duration.ofMillis(100) + ); } - public static final ListStorable arenas = new ListStorable<>(ArenaConfigStorable::new); - public static final DurationStorable extractionDuration = new DurationStorable(); + public ExtractionConfig { + instance = this; + } - public static void registerAndLoad(Plugin plugin) { - var configFile = ConfigFile.of(plugin.getDataPath().resolve("config.json")); - ConfigFileRegistry.get().register(configFile); - { - configFile.registerStorable("arenas", arenas); - configFile.registerStorable("extractionDuration", extractionDuration); - } - try { - configFile.load(); - } catch (IOException e) { - throw new RuntimeException("failed loading config", e); - } + public static ExtractionConfig get() { + return instance; } } diff --git a/minigame/extraction/site/lab0x13/scrow/extraction/config/ExtractionConfigStorable.java b/minigame/extraction/site/lab0x13/scrow/extraction/config/ExtractionConfigStorable.java new file mode 100644 index 0000000..275b62a --- /dev/null +++ b/minigame/extraction/site/lab0x13/scrow/extraction/config/ExtractionConfigStorable.java @@ -0,0 +1,29 @@ +package site.lab0x13.scrow.extraction.config; + +import site.lab0x13.scrow.configurator.configfile.ConfigFile; +import site.lab0x13.scrow.configurator.storable.complex.FieldReader; +import site.lab0x13.scrow.configurator.storable.complex.FieldRegistry; +import site.lab0x13.scrow.configurator.storable.impl.DurationStorable; +import site.lab0x13.scrow.configurator.storable.list.ListStorable; + +import java.nio.file.Path; + +public class ExtractionConfigStorable extends ConfigFile { + public ExtractionConfigStorable(Path path) { + super(path); + } + + @Override + protected void registerFields(FieldRegistry registry) { + registry.registerField("arenas", new ListStorable<>(ArenaConfigStorable::new), ExtractionConfig::arenas); + registry.registerField("extractionDuration", new DurationStorable(), ExtractionConfig::extractionDuration); + } + + @Override + protected ExtractionConfig construct(FieldReader reader) { + return new ExtractionConfig( + reader.read("arenas"), + reader.read("extractionDuration") + ); + } +} diff --git a/minigame/extraction/site/lab0x13/scrow/extraction/extractionpoint/ExtractionPoint.java b/minigame/extraction/site/lab0x13/scrow/extraction/extractionpoint/ExtractionPoint.java index bccd90c..dd40a80 100644 --- a/minigame/extraction/site/lab0x13/scrow/extraction/extractionpoint/ExtractionPoint.java +++ b/minigame/extraction/site/lab0x13/scrow/extraction/extractionpoint/ExtractionPoint.java @@ -3,6 +3,7 @@ package site.lab0x13.scrow.extraction.extractionpoint; import org.bukkit.Location; import org.bukkit.entity.Player; import site.lab0x13.scrow.extraction.compass.CompassTarget; +import site.lab0x13.scrow.extraction.config.ExtractionConfig; import java.util.HashMap; import java.util.Map; diff --git a/minigame/extraction/site/lab0x13/scrow/extraction/extractionpoint/ExtractionProgress.java b/minigame/extraction/site/lab0x13/scrow/extraction/extractionpoint/ExtractionProgress.java index 47757ec..a803990 100644 --- a/minigame/extraction/site/lab0x13/scrow/extraction/extractionpoint/ExtractionProgress.java +++ b/minigame/extraction/site/lab0x13/scrow/extraction/extractionpoint/ExtractionProgress.java @@ -7,7 +7,6 @@ import site.lab0x13.scrow.extraction.config.ExtractionConfig; import java.time.Duration; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.function.Consumer; import static java.util.Objects.requireNonNull; @@ -28,12 +27,12 @@ public class ExtractionProgress { private final List> changeSubscribers = new ArrayList<>(); private final long requiredMs; /** - * System.currentTimeMillis() at first click (in this attempt to extract) - * or < 0 if extracting hasn't been attempted recently. + * System.currentTimeMillis() at first click (in this attempt to extract) + * or < 0 if extracting hasn't been attempted recently. */ private long clickingSince = -1; /** - * System.currentTimeMillis() at last click + * System.currentTimeMillis() at last click */ private long lastClickMs = 0; @@ -45,7 +44,7 @@ public class ExtractionProgress { } public ExtractionProgress() { - this(requireNonNull(ExtractionConfig.extractionDuration.value())); + this(ExtractionConfig.get().extractionDuration()); } public void advanceExtraction() { @@ -57,6 +56,7 @@ public class ExtractionProgress { /* reset if not called again for a while */ new BukkitRunnable() { final long lastClickMsAtStart = lastClickMs; + @Override public void run() { if (lastClickMsAtStart == lastClickMs)