在插件中使用 Mixin

警告

这些文档是为 SpongeAPI 7 编写的,可能已经过时。 如果你觉得你可以帮助更新它们,请提交一个 PR!

Mixins 可用于在特定的类加载之前对它们进行修改。你可以在插件中使用 Mixin,以为你的服务器进行专门的定制——而不需要 Fork Sponge 的源代码。相关的修改将直接和你的插件绑定,并且在你的插件被加载时进行。

也參考

Mixin 的开发文档

Mixin 的开发文档中有着关于 Mixin 的介绍。

示例插件

示例插件使用了 Mixin 以在服务端加载的时候输出一条消息。

設定

  1. 在你的插件中添加 Mixin 作为依赖库:

    dependencies {
        compile 'org.spongepowered:mixin:0.7.11-SNAPSHOT'
    }
    
  2. 在你的插件的资源文件夹(Resource Folder)中添加有关于 Mixin 的配置,如 mixins.myplugin.json

    {
        "required": true,
        "minVersion": "0.7.10",
        "package": "com.example.myplugin.mixin",
        "refmap": "mixins.myplugin.refmap.json",
        "target": "@env(DEFAULT)",
        "compatibilityLevel": "JAVA_8",
        "mixins": [
            "MixinMinecraftServer"
        ]
    }
    
  3. 在特定的包中添加你的 Mixin 类:

    package com.example.myplugin.mixin;
    
    import net.minecraft.server.MinecraftServer;
    import org.spongepowered.asm.mixin.Mixin;
    
    @Mixin(MinecraftServer.class)
    public abstract class MixinMinecraftServer {
    
    }
    

调试

通常情况下,Mixin 的配置文件由插件 JAR 的 Manifest 文件决定。不过由于在 IDE 中的插件并没有以 JAR 的形式打包,因此你需要在命令行参数中指定 Mixin 的配置:

  1. 在程序的运行配置选项中为你的每一个 Mixin 配置文件都添加上 --mixin <mixin config file name> 这一命令行参数:

    --mixin mixins.myplugin.json
    

生产环境

即使 Mixin 已经可以在你的开发环境中跑起来了,但如果想要应用到生产环境中去,你还需要做一些事情:

  1. 在你的 Gradle 构建脚本中添加名为 MixinGradle 的插件:

    buildscript {
        repositories {
            maven {
                name = 'sponge'
                url = 'https://repo.spongepowered.org/repository/maven-public/'
            }
        }
        dependencies {
            classpath 'org.spongepowered:mixingradle:0.6-SNAPSHOT'
        }
    }
    
    apply plugin: 'org.spongepowered.mixin'
    
  2. 为你的 Mixin 配置设置映射表:

    sourceSets {
        main {
            ext.refMap = "mixins.myplugin.refmap.json"
        }
    }
    
  3. 在 JAR Manifest 中指定你的 Mixin 配置。如果你想要在 SpongeForge 中加载 Mixin,你需要添加 FMLCorePluginContainsFMLMod 选项:

    jar {
        manifest.attributes(
            'TweakClass': 'org.spongepowered.asm.launch.MixinTweaker',
            'MixinConfigs': 'mixins.myplugin.json',
            'FMLCorePluginContainsFMLMod': 'true',
        )
    }
    
  4. 然后请确保你已重新运行了 Gradle 以重新构建插件 JAR。构建完成后,你的插件 JAR 就应该可以在 SpongeVanilla 和 SpongeForge 中使用 Mixin 了。

    gradle clean build