diff options
author | Wyvest <45589059+Wyvest@users.noreply.github.com> | 2022-06-27 03:54:28 +0700 |
---|---|---|
committer | Wyvest <45589059+Wyvest@users.noreply.github.com> | 2022-06-27 03:54:28 +0700 |
commit | 9afbfbc4c41bf8f90b5de901797e18375da2c01a (patch) | |
tree | 125282f723f1e17a8a077c0a3222f777fd74ca06 /src/main/java/cc/polyfrost/oneconfig/config | |
parent | f6bebfc3d14812dfac4592c1b35becf83d46cf76 (diff) | |
download | OneConfig-9afbfbc4c41bf8f90b5de901797e18375da2c01a.tar.gz OneConfig-9afbfbc4c41bf8f90b5de901797e18375da2c01a.tar.bz2 OneConfig-9afbfbc4c41bf8f90b5de901797e18375da2c01a.zip |
cache text
Diffstat (limited to 'src/main/java/cc/polyfrost/oneconfig/config')
3 files changed, 67 insertions, 3 deletions
diff --git a/src/main/java/cc/polyfrost/oneconfig/config/Config.java b/src/main/java/cc/polyfrost/oneconfig/config/Config.java index ee1d2bd..f864d71 100644 --- a/src/main/java/cc/polyfrost/oneconfig/config/Config.java +++ b/src/main/java/cc/polyfrost/oneconfig/config/Config.java @@ -1,6 +1,7 @@ package cc.polyfrost.oneconfig.config; import cc.polyfrost.oneconfig.config.annotations.CustomOption; +import cc.polyfrost.oneconfig.config.annotations.Exclude; import cc.polyfrost.oneconfig.config.annotations.HUD; import cc.polyfrost.oneconfig.config.annotations.Page; import cc.polyfrost.oneconfig.config.core.ConfigUtils; @@ -35,7 +36,7 @@ import java.util.function.Supplier; public class Config { public final transient HashMap<String, BasicOption> optionNames = new HashMap<>(); transient protected final String configFile; - transient protected final Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.TRANSIENT).setPrettyPrinting().create(); + transient protected final Gson gson = new GsonBuilder().setExclusionStrategies(new ExcludeStrategy()).excludeFieldsWithModifiers(Modifier.TRANSIENT).setPrettyPrinting().create(); transient public Mod mod; public transient boolean hasBeenInitialized = false; public boolean enabled = true; @@ -43,10 +44,21 @@ public class Config { /** * @param modData information about the mod * @param configFile file where config is stored + * @param initialize whether to initialize the config. */ - public Config(Mod modData, String configFile) { + public Config(Mod modData, String configFile, boolean initialize) { this.configFile = configFile; - init(modData); + if (initialize) { + init(modData); + } + } + + /** + * @param modData information about the mod + * @param configFile file where config is stored + */ + public Config(Mod modData, String configFile) { + this(modData, configFile, true); } public void init(Mod mod) { @@ -230,4 +242,29 @@ public class Config { keyBind.setRunnable(runnable); KeyBindHandler.INSTANCE.addKeyBind(keyBind); } + + private static class ExcludeStrategy implements ExclusionStrategy { + + /** + * @param f the field object that is under test + * @return true if the field should be ignored; otherwise false + */ + @Override + public boolean shouldSkipField(FieldAttributes f) { + Exclude annotation = f.getAnnotation(Exclude.class); + if (annotation != null) { + return annotation.type() != Exclude.ExcludeType.HUD; + } + return false; + } + + /** + * @param clazz the class object that is under test + * @return true if the class should be ignored; otherwise false + */ + @Override + public boolean shouldSkipClass(Class<?> clazz) { + return false; + } + } } diff --git a/src/main/java/cc/polyfrost/oneconfig/config/annotations/Exclude.java b/src/main/java/cc/polyfrost/oneconfig/config/annotations/Exclude.java new file mode 100644 index 0000000..6ffd1d9 --- /dev/null +++ b/src/main/java/cc/polyfrost/oneconfig/config/annotations/Exclude.java @@ -0,0 +1,24 @@ +package cc.polyfrost.oneconfig.config.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excludes fields from being serialized or deserialized by OneConfig's Config and HUD + * system. + * + * This can be used interchangeably with the transient modifier built into Java. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Exclude { + ExcludeType type() default ExcludeType.ALL; + + enum ExcludeType { + ALL, + CONFIG, + HUD + } +} diff --git a/src/main/java/cc/polyfrost/oneconfig/config/core/ConfigUtils.java b/src/main/java/cc/polyfrost/oneconfig/config/core/ConfigUtils.java index fb3ff3a..b8958de 100644 --- a/src/main/java/cc/polyfrost/oneconfig/config/core/ConfigUtils.java +++ b/src/main/java/cc/polyfrost/oneconfig/config/core/ConfigUtils.java @@ -1,5 +1,6 @@ package cc.polyfrost.oneconfig.config.core; +import cc.polyfrost.oneconfig.config.annotations.Exclude; import cc.polyfrost.oneconfig.config.elements.BasicOption; import cc.polyfrost.oneconfig.config.elements.OptionCategory; import cc.polyfrost.oneconfig.config.elements.OptionPage; @@ -55,6 +56,8 @@ public class ConfigUtils { parentClass = clazz; } for (Field field : fields) { + Exclude exclude = findAnnotation(field, Exclude.class); + if (exclude != null && exclude.type() != Exclude.ExcludeType.CONFIG) continue; Option option = findAnnotation(field, Option.class); if (option == null) continue; options.add(getOption(option, field, object)); |