aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorAaron <51387595+AzureAaron@users.noreply.github.com>2024-08-11 17:57:23 -0400
committerGitHub <noreply@github.com>2024-08-11 17:57:23 -0400
commitc68b9317ba9d6c97f12fa3eb29e405c8d26972df (patch)
tree52d461732b2a4295c36c42202f83b8327979192b /src/main/java
parentb55a59b1f81439f4688f0f843bdd30b6e8c9d2e3 (diff)
downloadSkyblocker-c68b9317ba9d6c97f12fa3eb29e405c8d26972df.tar.gz
Skyblocker-c68b9317ba9d6c97f12fa3eb29e405c8d26972df.tar.bz2
Skyblocker-c68b9317ba9d6c97f12fa3eb29e405c8d26972df.zip
Fix a lot of config crashes because of null values (#902)
* Fix a lot of config crashes because of null values * Implement suggestion
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/SkyblockerMod.java3
-rw-r--r--src/main/java/de/hysky/skyblocker/config/ConfigNullFieldsFix.java63
2 files changed, 66 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
index 4e110e15..7ede3c63 100644
--- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
+++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
@@ -2,6 +2,8 @@ package de.hysky.skyblocker;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
+
+import de.hysky.skyblocker.config.ConfigNullFieldsFix;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.config.datafixer.ConfigDataFixer;
import de.hysky.skyblocker.debug.Debug;
@@ -109,6 +111,7 @@ public class SkyblockerMod implements ClientModInitializer {
ConfigDataFixer.apply();
Utils.init();
SkyblockerConfigManager.init();
+ ConfigNullFieldsFix.init(); //DO NOT INIT ANY CLASS THAT USES CONFIG FIELDS BEFORE THIS!
SkyblockerScreen.initClass();
ProfileViewerScreen.initClass();
Tips.init();
diff --git a/src/main/java/de/hysky/skyblocker/config/ConfigNullFieldsFix.java b/src/main/java/de/hysky/skyblocker/config/ConfigNullFieldsFix.java
new file mode 100644
index 00000000..a16b3359
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/config/ConfigNullFieldsFix.java
@@ -0,0 +1,63 @@
+package de.hysky.skyblocker.config;
+
+import java.lang.reflect.Field;
+import java.util.Collection;
+import java.util.Map;
+
+import org.slf4j.Logger;
+
+import com.mojang.logging.LogUtils;
+
+import dev.isxander.yacl3.config.v2.api.SerialEntry;
+
+/**
+ * While this sounds like a data fixer it isn't. - It's the only reasonable solution to deal with the mine field
+ * that is YACL's null handling.
+ */
+public class ConfigNullFieldsFix {
+ private static final Logger LOGGER = LogUtils.getLogger();
+ private static final String CONFIGS_PACKAGE = "de.hysky.skyblocker.config.configs";
+
+ public static void init() {
+ SkyblockerConfig current = SkyblockerConfigManager.get();
+ SkyblockerConfig clean = new SkyblockerConfig();
+
+ try {
+ fixNullFields(current, clean);
+ SkyblockerConfigManager.save();
+ } catch (Exception e) {
+ LOGGER.error("[Skyblocker Config Null Fields Fixer] Failed to ensure that the config has no null fields! You may encounter crashes :(", e);
+ }
+ }
+
+ /**
+ * Traverse through every config field to ensure that is isn't null, if it is then reset the value.
+ */
+ private static void fixNullFields(Object target, Object source) throws Exception {
+ for (Field field : target.getClass().getDeclaredFields()) {
+ if (field.isAnnotationPresent(SerialEntry.class)) {
+ field.setAccessible(true);
+
+ Object targetValue = field.get(target);
+ Object sourceValue = field.get(source);
+
+ if (targetValue == null && sourceValue != null) {
+ field.set(target, sourceValue);
+ } else if (targetValue != null && sourceValue != null && isFixable(field.getType())) {
+ fixNullFields(targetValue, sourceValue);
+ }
+ }
+ }
+ }
+
+ private static boolean isFixable(Class<?> clazz) {
+ return !clazz.isPrimitive()
+ && !clazz.isEnum()
+ && !clazz.isRecord()
+ && !clazz.equals(String.class)
+ && !Number.class.isAssignableFrom(clazz)
+ && !Map.class.isAssignableFrom(clazz)
+ && !Collection.class.isAssignableFrom(clazz)
+ && clazz.getPackageName().startsWith(CONFIGS_PACKAGE);
+ }
+}