플러그인 Mixin

경고

These docs were written for SpongeAPI 7 and are likely out of date. If you feel like you can help update them, please submit a PR!

Mixins can be used to modify classes at runtime before they are loaded. You can use them in plugins if you want to optimize a part of the game specifically for your server - without having to fork Sponge. The modifications will be bundled directly with your plugin and are only active as long as the plugin is loaded.

더 보기

Mixin documentation

Mixin documentation including an introduction to Mixins.

Example plugin

Example plugin which uses Plugin Mixins to print a message when the server is starting.

Setup

  1. Add the Mixin library as dependency to your plugin:

    dependencies {
        compile 'org.spongepowered:mixin:0.7.11-SNAPSHOT'
    }
    
  2. Add a new Mixin configuration for your plugin, e.g. mixins.myplugin.json inside your resource folder:

    {
        "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. Add a Mixin class to the specified package:

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

디버그

Normally, the Mixin configuration is registered inside JAR manifest of the plugin. Since the plugin is not packaged in a JAR while debugging inside the IDE you need specify the Mixins to apply as command line options:

  1. Add a --mixin <mixin config file name> option for each Mixin configuration file to the program arguments of your run configuration:

    --mixin mixins.myplugin.json
    

Production

If your Mixin is working in your development environment you still need to make some changes to make it work in production:

  1. Apply the MixinGradle plugin to your build script:

    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. Set the refmap from your Mixin configuration:

    sourceSets {
        main {
            ext.refMap = "mixins.myplugin.refmap.json"
        }
    }
    
  3. Add your Mixin configuration to the JAR manifest. The FMLCorePluginContainsFMLMod manifest entry is necessary if you want to load your Mixin on SpongeForge:

    jar {
        manifest.attributes(
            'TweakClass': 'org.spongepowered.asm.launch.MixinTweaker',
            'MixinConfigs': 'mixins.myplugin.json',
            'FMLCorePluginContainsFMLMod': 'true',
        )
    }
    
  4. Make sure to re-build the plugin using Gradle. The Mixin should then get applied by SpongeVanilla and SpongeForge.

    gradle clean build