diff --git a/arclight-coremod/src/main/java/io/izzel/arclight/mod/util/remapper/PluginRemapper.java b/arclight-coremod/src/main/java/io/izzel/arclight/mod/util/remapper/PluginRemapper.java index 95bf99f2..204ee26c 100644 --- a/arclight-coremod/src/main/java/io/izzel/arclight/mod/util/remapper/PluginRemapper.java +++ b/arclight-coremod/src/main/java/io/izzel/arclight/mod/util/remapper/PluginRemapper.java @@ -81,7 +81,7 @@ public class PluginRemapper extends JarRemapper { } // BiMap: srg -> bukkit - private final Map> cacheFields = new ConcurrentHashMap<>(); + private final Map> cacheFields = new ConcurrentHashMap<>(); private final Map, Map>> cacheMethods = new ConcurrentHashMap<>(); private final Map cacheRemap = new ConcurrentHashMap<>(); @@ -114,19 +114,19 @@ public class PluginRemapper extends JarRemapper { } } - private BiMap getFields(Class cl, String internalName) { + private BiMap getFields(Class cl, String internalName) { return cacheFields.computeIfAbsent(internalName, k -> this.tryGetFields(cl, k)); } - private BiMap tryGetFields(Class cl, String internalName) { + private BiMap tryGetFields(Class cl, String internalName) { try { - HashBiMap map = HashBiMap.create(); + HashBiMap map = HashBiMap.create(); ArclightReflectionHandler.remapper = this; for (Field field : cl.getFields()) { - map.put(field.getName(), mapField(field)); + map.put(WrappedField.of(field), mapField(field)); } for (Field field : cl.getDeclaredFields()) { - map.put(field.getName(), mapField(field)); + map.put(WrappedField.of(field), mapField(field)); } ArclightReflectionHandler.remapper = null; return map; @@ -165,21 +165,24 @@ public class PluginRemapper extends JarRemapper { public String tryMapDecFieldToSrg(Class cl, String bukkitName) { String internalName = Type.getInternalName(cl); if (internalName.startsWith(PREFIX)) { - return getFields(cl, internalName).inverse().getOrDefault(bukkitName, bukkitName); + WrappedField field = getFields(cl, internalName).inverse().get(bukkitName); + return field == null ? bukkitName : field.name; } else return bukkitName; } public String tryMapFieldToSrg(Class cl, String bukkitName) { String internalName = Type.getInternalName(cl); if (shouldRemap(internalName)) { - return getFields(cl, internalName).inverse().getOrDefault(bukkitName, bukkitName); + WrappedField field = getFields(cl, internalName).inverse().get(bukkitName); + return field == null ? bukkitName : field.name; } else return bukkitName; } - public String tryMapFieldToBukkit(Class cl, String srgName) { + public String tryMapFieldToBukkit(Class cl, String srgName, Field field) { String internalName = Type.getInternalName(cl); if (internalName.startsWith(PREFIX)) { - return getFields(cl, internalName).getOrDefault(srgName, srgName); + BiMap fields = getFields(cl, internalName); + return fields.getOrDefault(WrappedField.of(field), srgName); } else return srgName; } @@ -337,6 +340,38 @@ public class PluginRemapper extends JarRemapper { } + private static class WrappedField { + + private final Class owner; + private final String name; + private final Class type; + + private WrappedField(Class owner, String name, Class type) { + this.owner = owner; + this.name = name; + this.type = type; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + WrappedField that = (WrappedField) o; + return Objects.equals(owner, that.owner) && + Objects.equals(name, that.name) && + Objects.equals(type, that.type); + } + + @Override + public int hashCode() { + return Objects.hash(owner, name, type); + } + + private static WrappedField of(Field field) { + return new WrappedField(field.getDeclaringClass(), field.getName(), field.getType()); + } + } + private static class WrappedMethod { private final String name; diff --git a/arclight-coremod/src/main/java/io/izzel/arclight/mod/util/remapper/generated/ArclightReflectionHandler.java b/arclight-coremod/src/main/java/io/izzel/arclight/mod/util/remapper/generated/ArclightReflectionHandler.java index 13eeb112..e9fd6083 100644 --- a/arclight-coremod/src/main/java/io/izzel/arclight/mod/util/remapper/generated/ArclightReflectionHandler.java +++ b/arclight-coremod/src/main/java/io/izzel/arclight/mod/util/remapper/generated/ArclightReflectionHandler.java @@ -66,7 +66,7 @@ public class ArclightReflectionHandler { // srg -> bukkit public static String redirectFieldGetName(Field field) { - return remapper.tryMapFieldToBukkit(field.getDeclaringClass(), field.getName()); + return remapper.tryMapFieldToBukkit(field.getDeclaringClass(), field.getName(), field); } // bukkit -> srg