From 9afbfbc4c41bf8f90b5de901797e18375da2c01a Mon Sep 17 00:00:00 2001 From: Wyvest <45589059+Wyvest@users.noreply.github.com> Date: Mon, 27 Jun 2022 03:54:28 +0700 Subject: cache text --- .../java/cc/polyfrost/oneconfig/config/Config.java | 43 ++++++++++++++++++++-- .../oneconfig/config/annotations/Exclude.java | 24 ++++++++++++ .../oneconfig/config/core/ConfigUtils.java | 3 ++ 3 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 src/main/java/cc/polyfrost/oneconfig/config/annotations/Exclude.java (limited to 'src/main/java/cc/polyfrost/oneconfig/config') 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 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)); -- cgit