From 35962542affd5cafeded486c56b40be815714f9b Mon Sep 17 00:00:00 2001
From: AnimeGitB <AnimeGitB@bigblueball.in>
Date: Thu, 24 Nov 2022 01:36:58 +1030
Subject: [PATCH] Fix oversight on EnumTypeAdapterFactory

---
 .../emu/grasscutter/utils/JsonAdapters.java   | 49 +++++++++----------
 1 file changed, 22 insertions(+), 27 deletions(-)

diff --git a/src/main/java/emu/grasscutter/utils/JsonAdapters.java b/src/main/java/emu/grasscutter/utils/JsonAdapters.java
index c9c1a330..20d2b243 100644
--- a/src/main/java/emu/grasscutter/utils/JsonAdapters.java
+++ b/src/main/java/emu/grasscutter/utils/JsonAdapters.java
@@ -71,37 +71,32 @@ public class JsonAdapters {
     static class EnumTypeAdapterFactory implements TypeAdapterFactory {
         @SuppressWarnings("unchecked")
         public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
-            Class<T> rawType = (Class<T>) type.getRawType();
-            if (!rawType.isEnum()) return null;
+            Class<T> enumClass = (Class<T>) type.getRawType();
+            if (!enumClass.isEnum()) return null;
+            
+            // Make mappings of (string) names to enum constants
+            val map = new HashMap<String, T>();
+            val enumConstants = enumClass.getEnumConstants();
+            for (val constant : enumConstants)
+                map.put(constant.toString(), constant);
 
-            Field id = null;
+            // If the enum also has a numeric value, map those to the constants too
             // System.out.println("Looking for enum value field");
-            for (Field f : rawType.getDeclaredFields()) {
-                id = switch (f.getName()) {
-                    case "value", "id" -> f;
-                    default -> null;
-                };
-                if (id != null) break;
-            }
-            if (id == null) {
-                // System.out.println("Not found");
-                return null;
-            }
-            // System.out.println("Enum value field found - " + id.getName());
-
-            val map = new HashMap<String, T>();
-            boolean acc = id.isAccessible();
-            id.setAccessible(true);
-            try {
-                for (T constant : rawType.getEnumConstants()) {
-                    map.put(constant.toString(), constant);
-                    map.put(String.valueOf(id.getInt(constant)), constant);
+            for (Field f : enumClass.getDeclaredFields()) {
+                if (switch (f.getName()) {case "value", "id" -> true; default -> false;}) {
+                    // System.out.println("Enum value field found - " + f.getName());
+                    boolean acc = f.isAccessible();
+                    f.setAccessible(true);
+                    try {
+                        for (val constant : enumConstants)
+                            map.put(String.valueOf(f.getInt(constant)), constant);
+                    } catch (IllegalAccessException e) {
+                        // System.out.println("Failed to access enum id field.");
+                    }
+                    f.setAccessible(acc);
+                    break;
                 }
-            } catch (IllegalAccessException e) {
-                // System.out.println("Failed to access enum id field.");
-                return null;
             }
-            id.setAccessible(acc);
 
             return new TypeAdapter<T>() {
                 public T read(JsonReader reader) throws IOException {
-- 
GitLab