From cc1bc22b7a0ec540522f614fc3a840ab183b6364 Mon Sep 17 00:00:00 2001 From: Kamesuta Date: Sun, 18 Dec 2016 19:30:02 +0900 Subject: [PATCH 1/4] coremod --- build.gradle | 7 ++- gradle.properties | 2 + .../mc/signpic/asm/SignPictureCorePlugin.java | 36 +++++++++++++ .../signpic/asm/SignPictureTransformer.java | 16 ++++++ .../mc/signpic/asm/lib/DescHelper.java | 44 +++++++++++++++ .../mc/signpic/asm/lib/FieldMatcher.java | 36 +++++++++++++ .../mc/signpic/asm/lib/MappedType.java | 37 +++++++++++++ .../mc/signpic/asm/lib/MethodMatcher.java | 47 ++++++++++++++++ .../mc/signpic/asm/lib/StopTransforming.java | 13 +++++ .../mc/signpic/asm/lib/TransformerState.java | 13 +++++ .../mc/signpic/asm/lib/VisitorHelper.java | 54 +++++++++++++++++++ 11 files changed, 303 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/SignPictureTransformer.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/DescHelper.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/FieldMatcher.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/MappedType.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/MethodMatcher.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/StopTransforming.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/TransformerState.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/VisitorHelper.java diff --git a/build.gradle b/build.gradle index 410545af..b3482c38 100644 --- a/build.gradle +++ b/build.gradle @@ -87,9 +87,12 @@ dependencies { } def commonManifest = { - if (project.hasProperty('extra_fmlat')) { + if (project.hasProperty('extra_fmlcore')) + attributes 'FMLCorePlugin': project.extra_fmlcore + if (project.hasProperty('extra_fmlmod')) + attributes 'FMLCorePluginContainsFMLMod': project.extra_fmlcore + if (project.hasProperty('extra_fmlat')) attributes 'FMLAT': project.extra_fmlat - } } jar { diff --git a/gradle.properties b/gradle.properties index 09302424..f3616878 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,8 @@ forgegradle=net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT group=com.kamesuta.mc modid=signpic modname=SignPicture +extra_fmlcore=com.kamesuta.mc.signpic.asm.SignPictureCorePlugin +extra_fmlmod=com.kamesuta.mc.signpic.SignPicture version_major=2 version_minor=6 version_micro=1 diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java b/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java new file mode 100644 index 00000000..804cefc0 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java @@ -0,0 +1,36 @@ +package com.kamesuta.mc.signpic.asm; + +import java.util.Map; + +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.relauncher.IFMLLoadingPlugin; +import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion; + +@MCVersion(value = Loader.MC_VERSION) +public class SignPictureCorePlugin implements IFMLLoadingPlugin { + @Override + public String[] getASMTransformerClass() { + return new String[] { + SignPictureTransformer.class.getName() + }; + } + + @Override + public String getModContainerClass() { + return null; + } + + @Override + public String getSetupClass() { + return null; + } + + @Override + public void injectData(final Map data) { + } + + @Override + public String getAccessTransformerClass() { + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureTransformer.java b/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureTransformer.java new file mode 100644 index 00000000..6ad0b691 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureTransformer.java @@ -0,0 +1,16 @@ +package com.kamesuta.mc.signpic.asm; + +import net.minecraft.launchwrapper.IClassTransformer; + +public class SignPictureTransformer implements IClassTransformer { + + @Override + public byte[] transform(final String name, final String transformedName, final byte[] bytes) { + if (bytes==null) + return bytes; + + // 1.7.10 comming soon + + return bytes; + } +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/DescHelper.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/DescHelper.java new file mode 100644 index 00000000..bd8167bf --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/DescHelper.java @@ -0,0 +1,44 @@ +package com.kamesuta.mc.signpic.asm.lib; + +import org.objectweb.asm.Type; + +public class DescHelper { + /** + {@link #toDesc(Object)}をMethodのDescriptor用に使えるようにしたもの。 + 下手なクラスをここに入れようとするとまずいので確信がない限りStringで入れるべき。 + + @param returnType {@link String}型か、{@link Class}型で目的のMethodの返り値の型を指定する。 + @param rawDesc {@link String}型か、{@link Class}型でMethodの引数たちの型を指定する。 + @throws IllegalArgumentException 引数に{@link String}型か、{@link Class}型以外が入ったら投げられる。 + @return Javaバイトコードで扱われる形の文字列に変換されたDescriptor。 + */ + public static String toDesc(final Object returnType, final Object... rawDesc) { + final StringBuilder sb = new StringBuilder("("); + for (final Object o : rawDesc) + sb.append(toDesc(o)); + sb.append(')'); + sb.append(toDesc(returnType)); + return sb.toString(); + } + + /** + {@link Class#forName}とか{@link Class#getCanonicalName()}したりするとまだ読み込まれてなかったりしてまずいので安全策。 + 下手なクラスをここに入れようとするとまずいので確信がない限りStringで入れるべき。 + + @param raw {@link String}型か、{@link Class}型でASM用の文字列に変換したいクラスを指定する。 + @throws IllegalArgumentException {@param raw}に{@link String}型か、{@link Class}型以外が入ったら投げられる。 + @return Javaバイトコードで扱われる形の文字列に変換されたクラス。 + */ + public static String toDesc(final Object raw) { + if (raw instanceof Class) { + final Class clazz = (Class) raw; + return Type.getDescriptor(clazz); + } else if (raw instanceof String) { + String desc = (String) raw; + desc = desc.replace('.', '/'); + desc = desc.matches("L.+;") ? desc : "L"+desc+";"; + return desc; + } else + throw new IllegalArgumentException(); + } +} diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/FieldMatcher.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/FieldMatcher.java new file mode 100644 index 00000000..433e8855 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/FieldMatcher.java @@ -0,0 +1,36 @@ +/* + * This class is from the OpenModsLib. + * https://github.com/OpenMods/OpenModsLib + * + * Code Copyright (c) 2013 Open Mods + * Code released under the MIT license + * https://github.com/OpenMods/OpenModsLib/blob/master/LICENSE + */ +package com.kamesuta.mc.signpic.asm.lib; + +import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; + +public class FieldMatcher { + private final String clsName; + private final String description; + private final String srgName; + private final String mcpName; + + public FieldMatcher(final String clsName, final String description, final String mcpName, final String srgName) { + this.clsName = clsName; + this.description = description; + this.srgName = srgName; + this.mcpName = mcpName; + } + + public boolean match(final String fieldName, final String fieldDesc) { + if (!fieldDesc.equals(this.description)) + return false; + if (fieldName.equals(this.mcpName)) + return true; + if (!VisitorHelper.useSrgNames()) + return false; + final String unmappedName = FMLDeobfuscatingRemapper.INSTANCE.mapFieldName(this.clsName, fieldName, fieldDesc); + return unmappedName.equals(this.srgName); + } +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/MappedType.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/MappedType.java new file mode 100644 index 00000000..8bbb05ce --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/MappedType.java @@ -0,0 +1,37 @@ +/* + * This class is from the OpenModsLib. + * https://github.com/OpenMods/OpenModsLib + * + * Code Copyright (c) 2013 Open Mods + * Code released under the MIT license + * https://github.com/OpenMods/OpenModsLib/blob/master/LICENSE + */ +package com.kamesuta.mc.signpic.asm.lib; + +import org.objectweb.asm.Type; + +public class MappedType { + + private final String clsName; + + public static MappedType of(final Class cls) { + return new MappedType(cls.getName()); + } + + public static MappedType of(final String clsName) { + return new MappedType(clsName); + } + + private MappedType(final String clsName) { + this.clsName = VisitorHelper.getMappedName(clsName.replace('.', '/')); + } + + public String name() { + return this.clsName; + } + + public Type type() { + return Type.getObjectType(this.clsName); + } + +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/MethodMatcher.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/MethodMatcher.java new file mode 100644 index 00000000..2388f0ec --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/MethodMatcher.java @@ -0,0 +1,47 @@ +/* + * This class is from the OpenModsLib. + * https://github.com/OpenMods/OpenModsLib + * + * Code Copyright (c) 2013 Open Mods + * Code released under the MIT license + * https://github.com/OpenMods/OpenModsLib/blob/master/LICENSE + */ +package com.kamesuta.mc.signpic.asm.lib; + +import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; + +public class MethodMatcher { + private final String clsName; + private final String description; + private final String srgName; + private final String mcpName; + + public MethodMatcher(final String clsName, final String description, final String mcpName, final String srgName) { + this.clsName = clsName; + this.description = description; + this.srgName = srgName; + this.mcpName = mcpName; + } + + public MethodMatcher(final MappedType cls, final String description, final String mcpName, final String srgName) { + this(cls.name(), description, mcpName, srgName); + } + + public boolean match(final String methodName, final String methodDesc) { + if (methodName.equals(this.mcpName)) + return true; + if (!VisitorHelper.useSrgNames()) + return false; + final String unmappedDesc = FMLDeobfuscatingRemapper.INSTANCE.mapMethodDesc(methodDesc); + if (!unmappedDesc.equals(this.description)) + return false; + final String unmappedName = FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(this.clsName, methodName, methodDesc); + return unmappedName.equals(this.srgName); + } + + @Override + public String toString() { + return String.format("Matcher: %s.[%s,%s] %s", this.clsName, this.srgName, this.mcpName, this.description); + } + +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/StopTransforming.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/StopTransforming.java new file mode 100644 index 00000000..23646491 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/StopTransforming.java @@ -0,0 +1,13 @@ +/* + * This class is from the OpenModsLib. + * https://github.com/OpenMods/OpenModsLib + * + * Code Copyright (c) 2013 Open Mods + * Code released under the MIT license + * https://github.com/OpenMods/OpenModsLib/blob/master/LICENSE + */ +package com.kamesuta.mc.signpic.asm.lib; + +public class StopTransforming extends RuntimeException { + private static final long serialVersionUID = -8222603827170240869L; +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/TransformerState.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/TransformerState.java new file mode 100644 index 00000000..375c5a58 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/TransformerState.java @@ -0,0 +1,13 @@ +/* + * This class is from the OpenModsLib. + * https://github.com/OpenMods/OpenModsLib + * + * Code Copyright (c) 2013 Open Mods + * Code released under the MIT license + * https://github.com/OpenMods/OpenModsLib/blob/master/LICENSE + */ +package com.kamesuta.mc.signpic.asm.lib; + +public enum TransformerState { + DISABLED, ENABLED, ACTIVATED, FINISHED, FAILED; +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/VisitorHelper.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/VisitorHelper.java new file mode 100644 index 00000000..86d91ea6 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/VisitorHelper.java @@ -0,0 +1,54 @@ +/* + * This class is from the OpenModsLib. + * https://github.com/OpenMods/OpenModsLib + * + * Code Copyright (c) 2013 Open Mods + * Code released under the MIT license + * https://github.com/OpenMods/OpenModsLib/blob/master/LICENSE + */ +package com.kamesuta.mc.signpic.asm.lib; + +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; + +import com.google.common.base.Preconditions; + +import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; +import net.minecraft.launchwrapper.Launch; + +public class VisitorHelper { + + public abstract static class TransformProvider { + private final int flags; + + public TransformProvider(final int flags) { + this.flags = flags; + } + + public abstract ClassVisitor createVisitor(String name, ClassVisitor cv); + } + + public static byte[] apply(final byte[] bytes, final String name, final TransformProvider context) { + Preconditions.checkNotNull(bytes); + final ClassReader cr = new ClassReader(bytes); + final ClassWriter cw = new ClassWriter(cr, context.flags); + final ClassVisitor mod = context.createVisitor(name, cw); + + try { + cr.accept(mod, 0); + return cw.toByteArray(); + } catch (final StopTransforming e) { + return bytes; + } + } + + public static boolean useSrgNames() { + final Boolean deobfuscated = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); + return deobfuscated==null||!deobfuscated; + } + + public static String getMappedName(final String clsName) { + return useSrgNames() ? FMLDeobfuscatingRemapper.INSTANCE.unmap(clsName) : clsName; + } +} \ No newline at end of file From da8843eafc74ab2c292f2d008ee01f52e17a68e7 Mon Sep 17 00:00:00 2001 From: Kamesuta Date: Sun, 18 Dec 2016 20:32:45 +0900 Subject: [PATCH 2/4] log --- .../kamesuta/mc/bnnwidget/StencilClip.java | 2 +- .../java/com/kamesuta/mc/signpic/Client.java | 2 +- .../com/kamesuta/mc/signpic/ClientProxy.java | 2 +- .../com/kamesuta/mc/signpic/CommonProxy.java | 2 +- .../java/com/kamesuta/mc/signpic/Debug.java | 2 +- .../com/kamesuta/mc/signpic/Locations.java | 4 +- .../java/com/kamesuta/mc/signpic/Log.java | 94 +++++++++---------- .../mc/signpic/entry/content/meta/MetaIO.java | 2 +- .../mc/signpic/gui/file/ExpUiUpload.java | 4 +- .../mc/signpic/handler/SignHandler.java | 4 +- .../mc/signpic/http/download/ModDownload.java | 2 +- .../mc/signpic/image/meta/ImageMeta.java | 2 +- .../mc/signpic/information/Informations.java | 4 +- .../com/kamesuta/mc/signpic/state/State.java | 2 +- 14 files changed, 64 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/kamesuta/mc/bnnwidget/StencilClip.java b/src/main/java/com/kamesuta/mc/bnnwidget/StencilClip.java index fa6b4074..ee927155 100644 --- a/src/main/java/com/kamesuta/mc/bnnwidget/StencilClip.java +++ b/src/main/java/com/kamesuta/mc/bnnwidget/StencilClip.java @@ -88,7 +88,7 @@ public static void init() { ReflectionHelper. getPrivateValue(MinecraftForgeClient.class, null, "stencilBits").set(0, 8); } } catch (final Throwable e) { - Log.info("Failed to enable stencil buffer", e); + Log.log.info("Failed to enable stencil buffer", e); } } } diff --git a/src/main/java/com/kamesuta/mc/signpic/Client.java b/src/main/java/com/kamesuta/mc/signpic/Client.java index ec337e57..9a0f0112 100644 --- a/src/main/java/com/kamesuta/mc/signpic/Client.java +++ b/src/main/java/com/kamesuta/mc/signpic/Client.java @@ -129,7 +129,7 @@ public static void deleteMod(final File mod) { if (!mod.delete()) { mod.deleteOnExit(); final String msg = Reference.NAME+" was unable to delete file "+mod.getPath()+" the game will now try to delete it on exit. If this dialog appears again, delete it manually."; - Log.error(msg); + Log.log.error(msg); if (!GraphicsEnvironment.isHeadless()) JOptionPane.showMessageDialog(null, msg, "An update error has occured", JOptionPane.ERROR_MESSAGE); } diff --git a/src/main/java/com/kamesuta/mc/signpic/ClientProxy.java b/src/main/java/com/kamesuta/mc/signpic/ClientProxy.java index f25d106e..dab5a583 100644 --- a/src/main/java/com/kamesuta/mc/signpic/ClientProxy.java +++ b/src/main/java/com/kamesuta/mc/signpic/ClientProxy.java @@ -60,7 +60,7 @@ private File getDataDirectory() { try { return file.getCanonicalFile(); } catch (final IOException e) { - Log.debugerror("Could not canonize path!", e); + Log.dev.error("Could not canonize path!", e); } return file; } diff --git a/src/main/java/com/kamesuta/mc/signpic/CommonProxy.java b/src/main/java/com/kamesuta/mc/signpic/CommonProxy.java index 360c629d..ae018c7d 100644 --- a/src/main/java/com/kamesuta/mc/signpic/CommonProxy.java +++ b/src/main/java/com/kamesuta/mc/signpic/CommonProxy.java @@ -6,7 +6,7 @@ public class CommonProxy { public void preInit(final FMLPreInitializationEvent event) { - Log.logger = event.getModLog(); + Log.log = event.getModLog(); Config.instance = new Config(event.getSuggestedConfigurationFile()); } diff --git a/src/main/java/com/kamesuta/mc/signpic/Debug.java b/src/main/java/com/kamesuta/mc/signpic/Debug.java index 0271068b..32085564 100644 --- a/src/main/java/com/kamesuta/mc/signpic/Debug.java +++ b/src/main/java/com/kamesuta/mc/signpic/Debug.java @@ -63,7 +63,7 @@ public static void main(final String[] args) throws Exception { // Reference.logger.info(String.format("R:%.04f G:%.04f B:%.04f A:%.04f", r, g, b, a)); final String src = "gyazo.com/114514e"; - Log.info(replace(src)); + Log.log.info(replace(src)); } final static Pattern p = Pattern.compile("[^\\w]"); diff --git a/src/main/java/com/kamesuta/mc/signpic/Locations.java b/src/main/java/com/kamesuta/mc/signpic/Locations.java index 58328020..9b0dfab9 100644 --- a/src/main/java/com/kamesuta/mc/signpic/Locations.java +++ b/src/main/java/com/kamesuta/mc/signpic/Locations.java @@ -39,7 +39,7 @@ private File getSignPicDir(final File defaultdir) { if (!StringUtils.isEmpty(Config.instance.signpicDir.get())) { if (dir.exists()&&dir.isDirectory()&&!dir.equals(defaultdir)) return dir; - Log.debugerror("invalid signpic dir location! use default dir."); + Log.dev.error("invalid signpic dir location! use default dir."); } return new File(defaultdir, "signpic"); } @@ -53,7 +53,7 @@ private boolean securementDirectory(final File cachedir) { i++; } while (to.exists()); cachedir.renameTo(to); - Log.warn("non-directory conflicting file exists. renamed to "+to.getName()); + Log.log.warn("non-directory conflicting file exists. renamed to "+to.getName()); return true; } cachedir.mkdir(); diff --git a/src/main/java/com/kamesuta/mc/signpic/Log.java b/src/main/java/com/kamesuta/mc/signpic/Log.java index 442b6b1c..7c6901be 100644 --- a/src/main/java/com/kamesuta/mc/signpic/Log.java +++ b/src/main/java/com/kamesuta/mc/signpic/Log.java @@ -1,77 +1,77 @@ package com.kamesuta.mc.signpic; +import javax.annotation.Nonnull; + +import org.apache.commons.lang3.Validate; +import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.message.Message; +import org.apache.logging.log4j.spi.AbstractLogger; import com.kamesuta.mc.signpic.gui.OverlayFrame; public class Log { - public static Logger logger = LogManager.getLogger(Reference.MODID); + public static Logger log = LogManager.getLogger(Reference.MODID); + public static Logger dev = new DevLogger(log); - public static void error(final Object message) { - logger.error(message); - } + private static class DevLogger extends AbstractLogger { + private Logger logger; - public static void error(final Object message, final Throwable e) { - logger.error(message, e); - } + public DevLogger(@Nonnull final Logger logger) { + this.logger = logger; + } - public static void warn(final Object message) { - logger.warn(message); - } + private boolean isEnabled() { + Validate.notNull(Config.instance, "internal error: debug logger can be used after config loaded!"); + return Config.instance.debugLog.get(); + } - public static void warn(final Object message, final Throwable e) { - logger.warn(message, e); - } + @Override + protected boolean isEnabled(final Level level, final Marker marker, final Message data, final Throwable t) { + return isEnabled(); + } - public static void info(final Object message) { - logger.info(message); - } + @Override + protected boolean isEnabled(final Level level, final Marker marker, final Object data, final Throwable t) { + return isEnabled(); + } - public static void info(final Object message, final Throwable e) { - logger.info(message, e); - } + @Override + protected boolean isEnabled(final Level level, final Marker marker, final String data) { + return isEnabled(); + } - public static void debugerror(final Object message) { - if (Config.instance.debugLog.get()) - logger.error("[DEBUG] "+message); - } + @Override + protected boolean isEnabled(final Level level, final Marker marker, final String data, final Object... p1) { + return isEnabled(); + } - public static void debugerror(final Object message, final Throwable e) { - if (Config.instance.debugLog.get()) - logger.error("[DEBUG] "+message, e); - } - - public static void debugwarn(final Object message) { - if (Config.instance.debugLog.get()) - logger.warn("[DEBUG] "+message); - } - - public static void debugwarn(final Object message, final Throwable e) { - if (Config.instance.debugLog.get()) - logger.warn("[DEBUG] "+message, e); - } - - public static void debuginfo(final Object message) { - if (Config.instance.debugLog.get()) - logger.info("[DEBUG] "+message); - } + @Override + protected boolean isEnabled(final Level level, final Marker marker, final String data, final Throwable t) { + return isEnabled(); + } - public static void debuginfo(final Object message, final Throwable e) { - if (Config.instance.debugLog.get()) - logger.info("[DEBUG] "+message, e); + @Override + public void log(final Marker marker, final String fqcn, final Level level, final Message data, final Throwable t) { + if (isEnabled()) + this.logger.log(level, marker, "[DEBUG] "+data.getFormattedMessage(), t); + } } @SuppressWarnings("deprecation") public static void notice(final Object notice, final float duration) { OverlayFrame.instance.pane.addNotice1(notice.toString(), duration); - debuginfo(notice); + if (dev!=null) + dev.info(notice); } @SuppressWarnings("deprecation") public static void notice(final String notice, final Throwable e, final float duration) { OverlayFrame.instance.pane.addNotice1(notice, duration); - debuginfo(notice, e); + if (dev!=null) + dev.info(notice, e); } public static void notice(final String notice) { diff --git a/src/main/java/com/kamesuta/mc/signpic/entry/content/meta/MetaIO.java b/src/main/java/com/kamesuta/mc/signpic/entry/content/meta/MetaIO.java index 9eb29194..b3d6a3b2 100644 --- a/src/main/java/com/kamesuta/mc/signpic/entry/content/meta/MetaIO.java +++ b/src/main/java/com/kamesuta/mc/signpic/entry/content/meta/MetaIO.java @@ -41,7 +41,7 @@ private E loadData() { return data; } } catch (final Exception e) { - Log.warn("content meta data is broken. aborted. ["+this.location.getName()+"]"); + Log.log.warn("content meta data is broken. aborted. ["+this.location.getName()+"]"); } finally { IOUtils.closeQuietly(reader); } diff --git a/src/main/java/com/kamesuta/mc/signpic/gui/file/ExpUiUpload.java b/src/main/java/com/kamesuta/mc/signpic/gui/file/ExpUiUpload.java index d16d0e73..e9646e16 100644 --- a/src/main/java/com/kamesuta/mc/signpic/gui/file/ExpUiUpload.java +++ b/src/main/java/com/kamesuta/mc/signpic/gui/file/ExpUiUpload.java @@ -41,11 +41,11 @@ protected void close() { @Override protected void apply(final File f) { - Log.info(f.getAbsolutePath()); + Log.log.info(f.getAbsolutePath()); } @Override protected void transfer(final Transferable transferable) { - Log.info(transferable); + Log.log.info(transferable); } }; \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/handler/SignHandler.java b/src/main/java/com/kamesuta/mc/signpic/handler/SignHandler.java index 6fb3c8fe..652c9fb4 100644 --- a/src/main/java/com/kamesuta/mc/signpic/handler/SignHandler.java +++ b/src/main/java/com/kamesuta/mc/signpic/handler/SignHandler.java @@ -59,7 +59,7 @@ public static void init() { guiEditSignTileEntity = field; } } catch (final SecurityException e) { - Log.error("Could not hook TileEntitySign field included in GuiEditSign", e); + Log.log.error("Could not hook TileEntitySign field included in GuiEditSign", e); } try { final Field[] fields = GuiRepair.class.getDeclaredFields(); @@ -74,7 +74,7 @@ public static void init() { } } } catch (final SecurityException e) { - Log.error("Could not hook GuiTextField or ContainerRepair field included in GuiRepair", e); + Log.log.error("Could not hook GuiTextField or ContainerRepair field included in GuiRepair", e); } } diff --git a/src/main/java/com/kamesuta/mc/signpic/http/download/ModDownload.java b/src/main/java/com/kamesuta/mc/signpic/http/download/ModDownload.java index 7a08a505..70e11588 100644 --- a/src/main/java/com/kamesuta/mc/signpic/http/download/ModDownload.java +++ b/src/main/java/com/kamesuta/mc/signpic/http/download/ModDownload.java @@ -104,7 +104,7 @@ protected void afterWrite(final int n) throws IOException { onDone(new CommunicateResponse(true, null)); return; } catch (final Throwable e) { - Log.warn("Updater Downloading Error", e); + Log.log.warn("Updater Downloading Error", e); final IChatComponent chat = new ChatBuilder().setChat(new ChatComponentTranslation("signpic.versioning.error").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.RED))).build(); this.result = new ModDLResult(chat); onDone(new CommunicateResponse(false, e)); diff --git a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageMeta.java b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageMeta.java index 873ab48a..3f4c73c2 100644 --- a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageMeta.java +++ b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageMeta.java @@ -54,7 +54,7 @@ public ImageMeta parse(final String src) { b = parseMeta(src, key, value)&&b; } } - Log.debuginfo("signmeta={"+src+"}, unsupported="+!b); + Log.dev.info("signmeta={"+src+"}, unsupported="+!b); this.hasInvalidMeta = this.hasInvalidMeta||!b; return this; } diff --git a/src/main/java/com/kamesuta/mc/signpic/information/Informations.java b/src/main/java/com/kamesuta/mc/signpic/information/Informations.java index d3e2ba73..ffe7e315 100644 --- a/src/main/java/com/kamesuta/mc/signpic/information/Informations.java +++ b/src/main/java/com/kamesuta/mc/signpic/information/Informations.java @@ -131,7 +131,7 @@ public void onDone(final ICommunicateResponse res) { if (checker.result!=null) setSource(checker.result); if (res.getError()!=null) - Log.warn("Could not check version information", res.getError()); + Log.log.warn("Could not check version information", res.getError()); if (after!=null) after.run(); } @@ -179,7 +179,7 @@ public void runUpdate() { try { Desktop.getDesktop().open(Client.location.modDir.getCanonicalFile()); } catch (final IOException e) { - Log.error(e.getMessage(), e); + Log.log.error(e.getMessage(), e); } } else if (state.downloading) { ChatBuilder.create("signpic.versioning.downloadingAlready").useTranslation().setStyle(new ChatStyle().setColor(EnumChatFormatting.RED)).chatClient(); diff --git a/src/main/java/com/kamesuta/mc/signpic/state/State.java b/src/main/java/com/kamesuta/mc/signpic/state/State.java index 78c79b09..a715d624 100644 --- a/src/main/java/com/kamesuta/mc/signpic/state/State.java +++ b/src/main/java/com/kamesuta/mc/signpic/state/State.java @@ -73,7 +73,7 @@ public State setErrorMessage(final Throwable throwable) { } catch (final Throwable e) { setMessage(I18n.format("signpic.advmsg.unknown", e)); } - Log.debugerror(getMessage(), throwable); + Log.dev.error(getMessage(), throwable); } return this; } From f7710847feb7c07a31810e574a80b09da4ebcb9d Mon Sep 17 00:00:00 2001 From: Kamesuta Date: Sun, 18 Dec 2016 20:49:38 +0900 Subject: [PATCH 3/4] coremod --- build.gradle | 7 ++- gradle.properties | 2 + .../mc/signpic/asm/SignPictureCorePlugin.java | 36 +++++++++++++ .../signpic/asm/SignPictureTransformer.java | 16 ++++++ .../mc/signpic/asm/lib/DescHelper.java | 44 +++++++++++++++ .../mc/signpic/asm/lib/FieldMatcher.java | 36 +++++++++++++ .../mc/signpic/asm/lib/MappedType.java | 37 +++++++++++++ .../mc/signpic/asm/lib/MethodMatcher.java | 47 ++++++++++++++++ .../mc/signpic/asm/lib/StopTransforming.java | 13 +++++ .../mc/signpic/asm/lib/TransformerState.java | 13 +++++ .../mc/signpic/asm/lib/VisitorHelper.java | 54 +++++++++++++++++++ 11 files changed, 303 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/SignPictureTransformer.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/DescHelper.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/FieldMatcher.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/MappedType.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/MethodMatcher.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/StopTransforming.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/TransformerState.java create mode 100644 src/main/java/com/kamesuta/mc/signpic/asm/lib/VisitorHelper.java diff --git a/build.gradle b/build.gradle index 5c0c9618..e7078fbf 100644 --- a/build.gradle +++ b/build.gradle @@ -84,9 +84,12 @@ dependencies { } def commonManifest = { - if (project.hasProperty('extra_fmlat')) { + if (project.hasProperty('extra_fmlcore')) + attributes 'FMLCorePlugin': project.extra_fmlcore + if (project.hasProperty('extra_fmlmod')) + attributes 'FMLCorePluginContainsFMLMod': project.extra_fmlcore + if (project.hasProperty('extra_fmlat')) attributes 'FMLAT': project.extra_fmlat - } } jar { diff --git a/gradle.properties b/gradle.properties index 696431b9..c348ede6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,8 @@ forgegradle=net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT group=com.kamesuta.mc modid=signpic modname=SignPicture +extra_fmlcore=com.kamesuta.mc.signpic.asm.SignPictureCorePlugin +extra_fmlmod=com.kamesuta.mc.signpic.SignPicture version_major=2 version_minor=6 version_micro=1 diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java b/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java new file mode 100644 index 00000000..b0ec8c14 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java @@ -0,0 +1,36 @@ +package com.kamesuta.mc.signpic.asm; + +import java.util.Map; + +import net.minecraftforge.common.ForgeVersion; +import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; +import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin.MCVersion; + +@MCVersion(value = ForgeVersion.mcVersion) +public class SignPictureCorePlugin implements IFMLLoadingPlugin { + @Override + public String[] getASMTransformerClass() { + return new String[] { + SignPictureTransformer.class.getName() + }; + } + + @Override + public String getModContainerClass() { + return null; + } + + @Override + public String getSetupClass() { + return null; + } + + @Override + public void injectData(final Map data) { + } + + @Override + public String getAccessTransformerClass() { + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureTransformer.java b/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureTransformer.java new file mode 100644 index 00000000..2ee5df43 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureTransformer.java @@ -0,0 +1,16 @@ +package com.kamesuta.mc.signpic.asm; + +import net.minecraft.launchwrapper.IClassTransformer; + +public class SignPictureTransformer implements IClassTransformer { + + @Override + public byte[] transform(final String name, final String transformedName, final byte[] bytes) { + if (bytes==null) + return bytes; + + // 1.8.9 comming soon + + return bytes; + } +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/DescHelper.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/DescHelper.java new file mode 100644 index 00000000..bd8167bf --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/DescHelper.java @@ -0,0 +1,44 @@ +package com.kamesuta.mc.signpic.asm.lib; + +import org.objectweb.asm.Type; + +public class DescHelper { + /** + {@link #toDesc(Object)}をMethodのDescriptor用に使えるようにしたもの。 + 下手なクラスをここに入れようとするとまずいので確信がない限りStringで入れるべき。 + + @param returnType {@link String}型か、{@link Class}型で目的のMethodの返り値の型を指定する。 + @param rawDesc {@link String}型か、{@link Class}型でMethodの引数たちの型を指定する。 + @throws IllegalArgumentException 引数に{@link String}型か、{@link Class}型以外が入ったら投げられる。 + @return Javaバイトコードで扱われる形の文字列に変換されたDescriptor。 + */ + public static String toDesc(final Object returnType, final Object... rawDesc) { + final StringBuilder sb = new StringBuilder("("); + for (final Object o : rawDesc) + sb.append(toDesc(o)); + sb.append(')'); + sb.append(toDesc(returnType)); + return sb.toString(); + } + + /** + {@link Class#forName}とか{@link Class#getCanonicalName()}したりするとまだ読み込まれてなかったりしてまずいので安全策。 + 下手なクラスをここに入れようとするとまずいので確信がない限りStringで入れるべき。 + + @param raw {@link String}型か、{@link Class}型でASM用の文字列に変換したいクラスを指定する。 + @throws IllegalArgumentException {@param raw}に{@link String}型か、{@link Class}型以外が入ったら投げられる。 + @return Javaバイトコードで扱われる形の文字列に変換されたクラス。 + */ + public static String toDesc(final Object raw) { + if (raw instanceof Class) { + final Class clazz = (Class) raw; + return Type.getDescriptor(clazz); + } else if (raw instanceof String) { + String desc = (String) raw; + desc = desc.replace('.', '/'); + desc = desc.matches("L.+;") ? desc : "L"+desc+";"; + return desc; + } else + throw new IllegalArgumentException(); + } +} diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/FieldMatcher.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/FieldMatcher.java new file mode 100644 index 00000000..4c3b07ca --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/FieldMatcher.java @@ -0,0 +1,36 @@ +/* + * This class is from the OpenModsLib. + * https://github.com/OpenMods/OpenModsLib + * + * Code Copyright (c) 2013 Open Mods + * Code released under the MIT license + * https://github.com/OpenMods/OpenModsLib/blob/master/LICENSE + */ +package com.kamesuta.mc.signpic.asm.lib; + +import net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; + +public class FieldMatcher { + private final String clsName; + private final String description; + private final String srgName; + private final String mcpName; + + public FieldMatcher(final String clsName, final String description, final String mcpName, final String srgName) { + this.clsName = clsName; + this.description = description; + this.srgName = srgName; + this.mcpName = mcpName; + } + + public boolean match(final String fieldName, final String fieldDesc) { + if (!fieldDesc.equals(this.description)) + return false; + if (fieldName.equals(this.mcpName)) + return true; + if (!VisitorHelper.useSrgNames()) + return false; + final String unmappedName = FMLDeobfuscatingRemapper.INSTANCE.mapFieldName(this.clsName, fieldName, fieldDesc); + return unmappedName.equals(this.srgName); + } +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/MappedType.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/MappedType.java new file mode 100644 index 00000000..8bbb05ce --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/MappedType.java @@ -0,0 +1,37 @@ +/* + * This class is from the OpenModsLib. + * https://github.com/OpenMods/OpenModsLib + * + * Code Copyright (c) 2013 Open Mods + * Code released under the MIT license + * https://github.com/OpenMods/OpenModsLib/blob/master/LICENSE + */ +package com.kamesuta.mc.signpic.asm.lib; + +import org.objectweb.asm.Type; + +public class MappedType { + + private final String clsName; + + public static MappedType of(final Class cls) { + return new MappedType(cls.getName()); + } + + public static MappedType of(final String clsName) { + return new MappedType(clsName); + } + + private MappedType(final String clsName) { + this.clsName = VisitorHelper.getMappedName(clsName.replace('.', '/')); + } + + public String name() { + return this.clsName; + } + + public Type type() { + return Type.getObjectType(this.clsName); + } + +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/MethodMatcher.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/MethodMatcher.java new file mode 100644 index 00000000..0afa9e46 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/MethodMatcher.java @@ -0,0 +1,47 @@ +/* + * This class is from the OpenModsLib. + * https://github.com/OpenMods/OpenModsLib + * + * Code Copyright (c) 2013 Open Mods + * Code released under the MIT license + * https://github.com/OpenMods/OpenModsLib/blob/master/LICENSE + */ +package com.kamesuta.mc.signpic.asm.lib; + +import net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; + +public class MethodMatcher { + private final String clsName; + private final String description; + private final String srgName; + private final String mcpName; + + public MethodMatcher(final String clsName, final String description, final String mcpName, final String srgName) { + this.clsName = clsName; + this.description = description; + this.srgName = srgName; + this.mcpName = mcpName; + } + + public MethodMatcher(final MappedType cls, final String description, final String mcpName, final String srgName) { + this(cls.name(), description, mcpName, srgName); + } + + public boolean match(final String methodName, final String methodDesc) { + if (methodName.equals(this.mcpName)) + return true; + if (!VisitorHelper.useSrgNames()) + return false; + final String unmappedDesc = FMLDeobfuscatingRemapper.INSTANCE.mapMethodDesc(methodDesc); + if (!unmappedDesc.equals(this.description)) + return false; + final String unmappedName = FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(this.clsName, methodName, methodDesc); + return unmappedName.equals(this.srgName); + } + + @Override + public String toString() { + return String.format("Matcher: %s.[%s,%s] %s", this.clsName, this.srgName, this.mcpName, this.description); + } + +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/StopTransforming.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/StopTransforming.java new file mode 100644 index 00000000..23646491 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/StopTransforming.java @@ -0,0 +1,13 @@ +/* + * This class is from the OpenModsLib. + * https://github.com/OpenMods/OpenModsLib + * + * Code Copyright (c) 2013 Open Mods + * Code released under the MIT license + * https://github.com/OpenMods/OpenModsLib/blob/master/LICENSE + */ +package com.kamesuta.mc.signpic.asm.lib; + +public class StopTransforming extends RuntimeException { + private static final long serialVersionUID = -8222603827170240869L; +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/TransformerState.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/TransformerState.java new file mode 100644 index 00000000..375c5a58 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/TransformerState.java @@ -0,0 +1,13 @@ +/* + * This class is from the OpenModsLib. + * https://github.com/OpenMods/OpenModsLib + * + * Code Copyright (c) 2013 Open Mods + * Code released under the MIT license + * https://github.com/OpenMods/OpenModsLib/blob/master/LICENSE + */ +package com.kamesuta.mc.signpic.asm.lib; + +public enum TransformerState { + DISABLED, ENABLED, ACTIVATED, FINISHED, FAILED; +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/lib/VisitorHelper.java b/src/main/java/com/kamesuta/mc/signpic/asm/lib/VisitorHelper.java new file mode 100644 index 00000000..2685b38d --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/asm/lib/VisitorHelper.java @@ -0,0 +1,54 @@ +/* + * This class is from the OpenModsLib. + * https://github.com/OpenMods/OpenModsLib + * + * Code Copyright (c) 2013 Open Mods + * Code released under the MIT license + * https://github.com/OpenMods/OpenModsLib/blob/master/LICENSE + */ +package com.kamesuta.mc.signpic.asm.lib; + +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; + +import com.google.common.base.Preconditions; + +import net.minecraft.launchwrapper.Launch; +import net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; + +public class VisitorHelper { + + public abstract static class TransformProvider { + private final int flags; + + public TransformProvider(final int flags) { + this.flags = flags; + } + + public abstract ClassVisitor createVisitor(String name, ClassVisitor cv); + } + + public static byte[] apply(final byte[] bytes, final String name, final TransformProvider context) { + Preconditions.checkNotNull(bytes); + final ClassReader cr = new ClassReader(bytes); + final ClassWriter cw = new ClassWriter(cr, context.flags); + final ClassVisitor mod = context.createVisitor(name, cw); + + try { + cr.accept(mod, 0); + return cw.toByteArray(); + } catch (final StopTransforming e) { + return bytes; + } + } + + public static boolean useSrgNames() { + final Boolean deobfuscated = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); + return deobfuscated==null||!deobfuscated; + } + + public static String getMappedName(final String clsName) { + return useSrgNames() ? FMLDeobfuscatingRemapper.INSTANCE.unmap(clsName) : clsName; + } +} \ No newline at end of file From 977d3c35f592cf0fb8d134cf6e58b3cc8417bce9 Mon Sep 17 00:00:00 2001 From: Kamesuta Date: Sun, 18 Dec 2016 21:02:01 +0900 Subject: [PATCH 4/4] # --- .../java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java b/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java index d1d86e0f..b0ec8c14 100644 --- a/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java +++ b/src/main/java/com/kamesuta/mc/signpic/asm/SignPictureCorePlugin.java @@ -33,4 +33,4 @@ public void injectData(final Map data) { public String getAccessTransformerClass() { return null; } -} +} \ No newline at end of file