FancyMenu Wiki/自定义按钮行为

关于

你可以使用FancyMenu API来写一个自定义按钮行为的拓展模组。你也可以将其用于自定义按钮元素,也可以在通过点击按钮执行你写的自定义按钮行为。

准备开发环境

请参阅 准备工作区

添加新的按钮行为

每一个自定义按钮行为都应被封装到 ButtonActionContainer (按钮行为容器)。

这个 container 需要在模组中初始化注册到 ButtonActionRegistry

创建 ButtonActionContainer

给你的按钮行为创建新的 ButtonActionContainer 子类,并为其命名。

在这个样例中,我会给我的演示按钮行为类命名为 ExampleButtonActionContainerWithValue。

在这个类中有一些重要的特殊东西需要解释一下。

构造方法(Constructor)

构造方法(Constructor)用于为你的按钮行为设置标识符。

还是那句话,不管是什么,标识符应该是独一无二的。不能说两个人共用一个sfz号。

确切来说,标识符并不是你的按钮行为名,所以你可以选一个独一无二的字符串捏。

这边推荐使用独一无二的东西当标识符前缀,比如你的用户名一样。否则有别人拓展模组用的标识符和你一样那不就冲突了(

public ExampleButtonActionContainerWithValue() {
    //The action identifier needs to be unique, so just use your username or something similar as prefix
    //这儿处需要唯一的行为标识符,把你的用户名或者其他的东西当标识符前缀不就得了。
    super("super_unique_action_identifier");
}

getAction()

这个方法会返回你的按钮行为的名称。

这个名字会用在编辑器中,炫一个你喜欢的名字。

当然,别你写行为本质是胖子,但你起的名字是瘦子就行。

//The name of your action. Should be lowercase and without any spaces.
//你的行为名都得小写不带空格。
@Override
public String getAction() {
    return "customaction";
}

hasValue()

在这里你可以设定你的按钮行为是否需要值。

譬如,打开GUI按钮行为就需要菜单标识符作为值。

相对地,关闭GUI按钮行为就不需要值。

//If the custom action has a value or not
//自定义行为是否需要值
@Override
public boolean hasValue() {
    return true;
}

execute(..)

这是这个类里最重要的方法。

这个方法是你用来创建按钮行为最基础的工具。

它会在按下绑定了自定义行为的自定义按钮后被调用。(来点被字地狱:当被绑定了,自定义按钮行为的,自定义按钮,被按下时,它会被调用。)

这里将按钮行为的值作为参数。

参数可以为空,留意一下。

所有你的按钮行为在按钮点击后都应该会被这个方法处理。

//Gets called when a button with this custom action is getting clicked
//当单击具有此自定义行为的按钮时调用。
@Override
public void execute(String value) {

    //This will open a new instance of the dirt message screen, when a button with this custom action is getting clicked
    //当带有自定义行为的按钮被点击后会打开一个新的泥土信息屏实例。
    //and will show the action value as message
    //并且会通过信息显示值。
    if (value != null) {
        Minecraft.getInstance().setScreen(new GenericDirtMessageScreen(new TextComponent(value)));
    }

}

getActionDescription()

你可以用这个方法描述你的按钮行为。

它会在布局编辑器显示。

重要: 越短越好,因为描述没那么多地方显示。

//The description of the action
//行为的描述
@Override
public String getActionDescription() {
    return "Show custom text in a dirt message screen.";
}

getValueDescription()

你的按钮行为值的描述。

你的按钮行为如果有值,那你得稍微详细地描述你的值是啥。

值描述和类型描述差不多。

如果你的按钮行为没有值,那你返回null得了。

重要: 越短越好,至于为啥,和上面一样。(暴躁)

//The action has a value, so I return a simple and short value description here.
//如果行为有值,那返回简练的描述就行。
//This is actually more like a value type description.
//和变量类型描述差不多。
@Override
public String getValueDescription() {
    return "Display Text";
}

getValueExample()

这个方法会返回一个按钮行为的值应该是什么样子的示例。

没值返回空。(耐心↓)

重要: 越短越好....(你知道我想说什么。(捂面))

//That's an example of how the action value should look like.
//行为值长这样 (指样例)
@Override
public String getValueExample() {
    //Well, it's just a simple String, so what should be the example here >.<
    //简简单单的字符串,塞一点示例。
    return "cool text to display";
}

完整样例

完整的ButtonActionContainer样例。

package de.keksuccino.fancymenu.api.buttonaction.example;

import de.keksuccino.fancymenu.api.buttonaction.ButtonActionContainer;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.GenericDirtMessageScreen;
import net.minecraft.network.chat.TextComponent;

public class ExampleButtonActionContainerWithValue extends ButtonActionContainer {

    public ExampleButtonActionContainerWithValue() {
        //The action identifier needs to be unique, so just use your username or something similar as prefix
        //这儿处需要唯一的行为标识符,把你的用户名或者其他的东西当标识符前缀不就得了。
        super("super_unique_action_identifier");
    }

    //The name of your action. Should be lowercase and without any spaces.
    //你的行为名都得小写不带空格。
    @Override
    public String getAction() {
        return "customaction";
    }

    //If the custom action has a value or not
    //自定义行为是否有值
    @Override
    public boolean hasValue() {
        return true;
    }

    //Gets called when a button with this custom action is getting clicked
    //当单击具有此自定义行为的按钮时调用。
    @Override
    public void execute(String value) {

        //This will open a new instance of the dirt message screen, when a button with this custom action is getting clicked
        //当带有自定义行为的按钮被点击后会打开一个新的泥土信息屏实例。
        //and will show the action value as message
        //并且还会以信息方式显示行为值。
        if (value != null) {
            Minecraft.getInstance().setScreen(new GenericDirtMessageScreen(new TextComponent(value)));
        }

    }

    //The description of the action
    //行为的描述
    @Override
    public String getActionDescription() {
        return "Show custom text in a dirt message screen.";
    }

    //The action has a value, so I return a simple and short value description here.
    //行为有值,所以得在这返回一段简练的值的描述。
    //This is actually more like a value type description.
    //更像是像值类型的描述。
    @Override
    public String getValueDescription() {
        return "Display Text";
    }

    //That's an example of how the action value should look like.
    //行为值长这样 (指样例)
    @Override
    public String getValueExample() {
        //Well, it's just a simple String, so what should be the example here >.<
        //简简单单的字符串,就像清清淡淡的人生。
        return "cool text to display";
    }

}

注册Container

你几乎要完成了,就差一步,(坠入深渊无法生还)很重要的一步。

FancyMenu得认你按钮行为,所以在你的拓展模组初始化时,你得在这个充满了注册的游戏中,注册你的ButtonActionContainerButtonActionRegistry

package de.keksuccino.fancymenu;

import net.minecraftforge.fml.common.Mod;
import de.keksuccino.fancymenu.api.buttonaction.ButtonActionRegistry;

@Mod("modid")
public class ExampleModMainClass {
    public ExampleModMainClass() {
        try {

            //Register your ButtonActionContainer to the ButtonActionRegistry at mod init.
            //在初始化中注册ButtonActionContainer到ButtonActionRegistry
            ButtonActionRegistry.registerButtonAction(new ExampleButtonActionContainerWithValue());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

现在你可以通过使用自定义按钮使用自定义按钮行为了。