FancyMenu Wiki/自定义占位符

Litwak913留言 | 贡献2022年11月22日 (二) 16:45的版本 (// Edit via Wikiplus)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

关于

通过在拓展模组中调用 FancyMenu API,即可创建在文本元素中使用的自定义占位符文本值。

准备开发环境

请参阅 准备工作区

添加新的占位符

每个自定义占位符都需要被封装成一个PlaceholderTextContainer类的对象,并被注册到PlaceholderTextRegistry中。

创建Container

创建自定义占位符仅需 PlaceholderTextContainer 一个类。该类提供自定义占位符的实际值和其余所有的重要属性。

FancyMenu 每游戏刻都会重新获取容器的值,即你可以随时对容器值进行操作。

为你的自定义占位符创建一个新类,给它起一个合适的类名,并继承PlaceholderTextContainer。此实例中自定义占位符的类名为ExamplePlaceholderTextContainer

占位符标识符

每个占位符都需要有一个唯一的标识符,建议使用你的用户名或模组 ID 作为前缀以避免冲突。标识符需要在构造函数中被定义,如下:

public ExamplePlaceholderTextContainer() {
    super("example_placeholder_identifier");
}

占位符本体

当占位符在被添加到文本元素中时会被替换成实际值,但 FancyMenu 需要知道在输入框中如何找到这个占位符。

每个占位符都应该以%开头和结尾。

@Override
public String getPlaceholder()
{
    return "%example_placeholder%";
}

分类

布局编辑器会将占位符分类,供用户查询所需。

@Override
public String getCategory()
{
    return "Example Category";
}

如在此处返回空,则该占位符会被自动归为"其他"分类中。

显示名

显示名会在布局编辑器中显示,供用户查看。

@Override
public String getDisplayName()
{
    return "Example Placeholder";
}

描述

在布局编辑器中设置文本时,此处定义的描述文本会在光标悬停在添加对应占位符的按钮上时显示。

@Override
public String[] getDescription()
{
    return new String[] {
        "This is a multiline",
        "placeholder description."
    };
}

如不想设置描述,返回空即可。

获取实际值

获取用于替换的实际值的方法是整个占位符中最重要的部分。

部分占位符的内容需要被频繁更新,所以 FancyMenu 会在每个渲染刻调用该获取方法。

注意,因为该方法会在布局中的每个文本元素每次被渲染时被调用,所以不要使用过于影响性能的东西。

完整样例

这是PlaceholderTextContainer的完整样例。

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

import de.keksuccino.fancymenu.api.placeholder.PlaceholderTextContainer;

//This needs to be registered to the PlaceholderTextRegistry at mod init
//在模组初始化时PlaceholderTextContainer应该注册到PlaceholderTextRegistry。
public class ExamplePlaceholderTextContainer extends PlaceholderTextContainer {

    public ExamplePlaceholderTextContainer() {
        super("example_placeholder_identifier");
    }

    @Override
    public String replacePlaceholders(String rawIn) {

        String placeholder = this.getPlaceholder();
        String realValue = "" + System.currentTimeMillis();

        //Replacing all placeholder occurrences with the real value and returning it
        //用真实的值替换所有占位符的出现,并返回它。
        return rawIn.replace(placeholder, realValue);

    }

    @Override
    public String getPlaceholder() {
        return "%example_placeholder%";
    }

    @Override
    public String getCategory() {
        return "Example Category";
    }

    @Override
    public String getDisplayName() {
        return "Example Placeholder";
    }

    @Override
    public String[] getDescription() {
        return new String[] {
                "This is a multiline",
                "placeholder description."
        };
    }

}

注册容器

你的占位符类差不多可以用了,不过你得告诉FancyMenu它的存在。

最后一步就是在你的拓展模组初始化时注册PlaceholderTextContainerPlaceholderTextRegistry

package de.keksuccino.fancymenu;

import net.minecraftforge.fml.common.Mod;
import de.keksuccino.fancymenu.api.placeholder.PlaceholderTextRegistry;

@Mod("modid")
public class ExampleModMainClass {

    public ExampleModMainClass() {
        try {

            //Register your PlaceholderTextContainer to the PlaceholderTextRegistry at mod init.
            //模组初始化时注册PlaceholderTextContainer到PlaceholderTextRegistry。
            PlaceholderTextRegistry.registerPlaceholder(new ExamplePlaceholderTextContainer());

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

}

现在你可以在文本元素中是用你自己的占位符了!