From 4be005617b3b8c3578cca07c5d085d12916f0d1d Mon Sep 17 00:00:00 2001
From: lclc98
Date: Thu, 30 Jun 2016 00:49:21 +1000
Subject: Json format (#2)
* Added new format
* Fixed bug
* Updated Version
---
.../java/cuchaz/enigma/MainFormatConverter.java | 121 +++++++++++++++++++++
1 file changed, 121 insertions(+)
create mode 100644 src/main/java/cuchaz/enigma/MainFormatConverter.java
(limited to 'src/main/java/cuchaz/enigma/MainFormatConverter.java')
diff --git a/src/main/java/cuchaz/enigma/MainFormatConverter.java b/src/main/java/cuchaz/enigma/MainFormatConverter.java
new file mode 100644
index 0000000..29e334e
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/MainFormatConverter.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Jeff Martin.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public
+ * License v3.0 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * Contributors:
+ * Jeff Martin - initial API and implementation
+ ******************************************************************************/
+package cuchaz.enigma;
+
+import com.google.common.collect.Maps;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.lang.reflect.Field;
+import java.util.Map;
+import java.util.jar.JarFile;
+
+import cuchaz.enigma.analysis.JarClassIterator;
+import cuchaz.enigma.mapping.*;
+import javassist.CtClass;
+import javassist.CtField;
+
+public class MainFormatConverter {
+
+ public static void main(String[] args)
+ throws Exception {
+
+ System.out.println("Getting field types from jar...");
+
+ JarFile jar = new JarFile(System.getProperty("user.home") + "/.minecraft/versions/1.8/1.8.jar");
+ Map fieldTypes = Maps.newHashMap();
+ for (CtClass c : JarClassIterator.classes(jar)) {
+ for (CtField field : c.getDeclaredFields()) {
+ FieldEntry fieldEntry = EntryFactory.getFieldEntry(field);
+ fieldTypes.put(getFieldKey(fieldEntry), moveClasssesOutOfDefaultPackage(fieldEntry.getType()));
+ }
+ }
+
+ System.out.println("Reading mappings...");
+
+ File fileMappings = new File("../Enigma Mappings/1.8.mappings");
+ MappingsReader mappingsReader = new MappingsReader() {
+
+ @Override
+ protected FieldMapping readField(String obf, String deobf, String type) {
+ // assume the void type for now
+ return new FieldMapping(obf, new Type("V"), deobf);
+ }
+ };
+ Mappings mappings = mappingsReader.read(fileMappings);
+
+ System.out.println("Updating field types...");
+
+ for (ClassMapping classMapping : mappings.classes()) {
+ updateFieldsInClass(fieldTypes, classMapping);
+ }
+
+ System.out.println("Saving mappings...");
+
+ //TODO Fix
+// try (FileWriter writer = new FileWriter(fileMappings)) {
+// new MappingsWriter().write(writer, mappings);
+// }
+
+ System.out.println("Done!");
+ }
+
+ private static Type moveClasssesOutOfDefaultPackage(Type type) {
+ return new Type(type, new ClassNameReplacer() {
+ @Override
+ public String replace(String className) {
+ ClassEntry entry = new ClassEntry(className);
+ if (entry.isInDefaultPackage()) {
+ return Constants.NonePackage + "/" + className;
+ }
+ return null;
+ }
+ });
+ }
+
+ private static void updateFieldsInClass(Map fieldTypes, ClassMapping classMapping)
+ throws Exception {
+
+ // update the fields
+ for (FieldMapping fieldMapping : classMapping.fields()) {
+ setFieldType(fieldTypes, classMapping, fieldMapping);
+ }
+
+ // recurse
+ for (ClassMapping innerClassMapping : classMapping.innerClasses()) {
+ updateFieldsInClass(fieldTypes, innerClassMapping);
+ }
+ }
+
+ private static void setFieldType(Map fieldTypes, ClassMapping classMapping, FieldMapping fieldMapping)
+ throws Exception {
+
+ // get the new type
+ Type newType = fieldTypes.get(getFieldKey(classMapping, fieldMapping));
+ if (newType == null) {
+ throw new Error("Can't find type for field: " + getFieldKey(classMapping, fieldMapping));
+ }
+
+ // hack in the new field type
+ Field field = fieldMapping.getClass().getDeclaredField("m_obfType");
+ field.setAccessible(true);
+ field.set(fieldMapping, newType);
+ }
+
+ private static Object getFieldKey(ClassMapping classMapping, FieldMapping fieldMapping) {
+ return classMapping.getObfSimpleName() + "." + fieldMapping.getObfName();
+ }
+
+ private static String getFieldKey(FieldEntry obfFieldEntry) {
+ return obfFieldEntry.getClassEntry().getSimpleName() + "." + obfFieldEntry.getName();
+ }
+}
--
cgit v1.2.3