MCBBS Wiki欢迎您共同参与编辑!在参与编辑之前请先阅读Wiki方针

如果在编辑的过程中遇到了什么问题,可以去讨论板提问。

为了您能够无阻碍地参与编辑 未验证/绑定过邮箱的用户,请尽快绑定/验证

MCBBS Wiki GitHub群组已上线!

您可以在回声洞中发表吐槽!

服务器状态监控。点击进入

本站由MCBBS用户自行搭建,与MCBBS及东银河系漫游指南(北京)科技有限公司没有从属关系。点此了解 MCBBS Wiki 不是什么>>

FancyMenu Wiki/自定义Visibility Requirements

来自MCBBS Wiki
Litwak913留言 | 贡献2022年11月22日 (二) 16:46的版本 (// Edit via Wikiplus)
跳到导航 跳到搜索

关于

通过在拓展模组中调用 FancyMenu API,即可自定义Visibility Requirements用于布局中的元素。

重要:Visibility RequirementsAPI只在FancyMenu v2.6.3+有效。

准备开发环境

请参阅 准备工作区

添加Visibility Requirements

Visibility Requirements使用VisibilityRequirement类。

你需要为每一个VisibilityRequirement Requirements 创建一个子类。

每个VisibilityRequirement都应该在模组初始化时注册到VisibilityRequirementRegistry

不同类型的Requirements

VisibilityRequirements可以用于两种不同的模式。

第一种是不使用任何值来检查是否满足 Requirements ,第二种是使用一个值。

如果 Requirements 使用值,那么用户在给一个元素设置 Requirements 时就需要输入这个值。

不使用值来创建 Requirements

创建一个VisibilityRequirement的新子类并取一个合适的名字。

接下来我会将我的示例类命名为ExampleVisibilityRequirement

同时有一些特殊的点需要特别留意一下。

构造方法(Constructor)

在构造方法中给你的 Requirements 定义唯一标识符。

public ExampleVisibilityRequirement() {
    //The identifier needs to be unique! It's not possible to register multiple requirements with the same identifier!
    //标识符独一无二,别想着用同一个标识符注册多个 Requirements 。
    super("example_requirement_no_value");
}

hasValue()

这个方法用于返回 Requirements 是否需要值。

因为我们不想给这个 Requirements 使用值,所以返回false

@Override
public boolean hasValue() {
    //We don't need a value in this requirement, so we return false here.
    //我们不想给这个 Requirements 使用值,返回false。
    return false;
}

isRequirementMet()

这是你的 Requirements 的最重要的方法。

这里用于返回是否满足在此要求中检查的条件。

这个方法以 Requirements 的值为参数,但因为这个 Requirements 没有值,所以参数为空。

//Here you return if the requirement is met (using the given requirement value if the requirement has one).
//在这里返回是否满足 Requirements (如果 Requirements 有值则返回 Requirements 的值)
//We don't use a value in this example, so the parameter will be NULL and we can ignore it.
//在这个样例中我们不使用值,所以参数为空,忽略即可。
@Override
public boolean isRequirementMet(@Nullable String value) {

    //In this example, we just check if the window is in fullscreen mode and if it is, then we return true.
    //在这个样例中我们只需要检查窗口是否处在全屏模式,如果是则返回true。
    return Minecraft.getInstance().options.fullscreen;

}

getDisplayName()

这个方法返回 Requirements 的显示名。

这个显示名会在布局编辑器的Visibility Requirements选项显示。

//This is the display name of the requirement.
//这个是 Requirements 的显示名。
//You don't have much space for the display name, so try to choose a short one.
//显示名写得简短一些,因为太长会显示出错。
@Override
public String getDisplayName() {
    return "Example Requirement [No Value]";
}

getDescription()

返回 Requirements 的描述。

当把鼠标悬停在切换 Requirements 按钮上时,该描述会作为工具提示显示。

//This is the description of the requirement.
//这里是 Requirements 的描述
@Override
public List<String> getDescription() {
    List<String> l = new ArrayList<>();
    l.add("This is an example requirement");
    l.add("without a value.");
    l.add("It checks if the window is in fullscreen.");
    return l;
}

getValueDisplayName()

这个方法返回值的显示名。

因为咱的 Requirements 不用值,返回空即可。

//Since this requirement has no value, just return NULL here.
//因为 Requirements 没有值,只需要在这里返回null。
@Override
public String getValueDisplayName() {
    return null;
}

getValuePreset()

返回自动设置到值输入文本字段的内容。

这个 Requirements 没有值输入字段,所以我们返回null

//No value, so just return NULL.
//没有值,返回null。
@Override
public String getValuePreset() {
    return null;
}

getValueInputFieldFilter()

该方法返回一个字符过滤器,该过滤器用来检查用户可以在数值输入文本字段中允许输入的字符。

没值,回null。

//You know the drill. No value = return NULL.
//没值 = 返回null(毁灭吧,我累了 *发动地鸣)
@Override
public CharacterFilter getValueInputFieldFilter() {
    return null;
}

完整示例

这个是完整的VisibilityRequirement样例。

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

import de.keksuccino.fancymenu.api.visibilityrequirements.VisibilityRequirement;
import de.keksuccino.konkrete.input.CharacterFilter;
import net.minecraft.client.Minecraft;

import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;

public class ExampleVisibilityRequirement extends VisibilityRequirement {

    public ExampleVisibilityRequirement() {
        //The identifier needs to be unique! It's not possible to register multiple requirements with the same identifier!
        //标识符独一无二,别想着用同一个标识符注册多个 Requirements 。
        super("example_requirement_no_value");
    }

    @Override
    public boolean hasValue() {
        //We don't need a value in this requirement, so we return false here.
        //我们不想给这个 Requirements 使用值,返回false。
        return false;
    }

    //Here you return if the requirement is met (using the given requirement value if the requirement has one).
    //在这里返回是否满足 Requirements (如果 Requirements 有值则返回 Requirements 的值)
    //We don't use a value in this example, so the parameter will be NULL and we can ignore it.
    //在这个样例中我们不使用值,所以参数为空,忽略即可。
    @Override
    public boolean isRequirementMet(@Nullable String value) {

        //In this example, we just check if the window is in fullscreen mode and if it is, then we return true.
        //在这个样例中我们只需要检查窗口是否处在全屏模式,如果是则返回true。
        return Minecraft.getInstance().options.fullscreen;

    }

    //This is the display name of the requirement.
    //这个是 Requirements 的显示名。
    //You don't have much space for the display name, so try to choose a short one.
    //显示名写得简短一些,因为太长会显示出错。
    @Override
    public String getDisplayName() {
        return "Example Requirement [No Value]";
    }

    //This is the description of the requirement.
    //这里是 Requirements 的描述
    @Override
    public List<String> getDescription() {
        List<String> l = new ArrayList<>();
        l.add("This is an example requirement");
        l.add("without a value.");
        l.add("It checks if the window is in fullscreen.");
        return l;
    }

    //Since this requirement has no value, just return NULL here.
    //因为 Requirements 没有值,只需要在这里返回null。
    @Override
    public String getValueDisplayName() {
        return null;
    }

    //No value, so just return NULL.
    //没有值,返回null。
    @Override
    public String getValuePreset() {
        return null;
    }

    //You know the drill. No value = return NULL.
    //没 null
    @Override
    public CharacterFilter getValueInputFieldFilter() {
        return null;
    }

}

注册Visibility Requirement

到这你几乎完成了。(译者:我也是 *冰箱里拿一瓶啤酒)

现在你只需要在游戏加载时将你的VisibilityRequirement注册到VisibilityRequirementRegistry

package de.keksuccino.fancymenu;

import net.minecraftforge.fml.common.Mod;
import de.keksuccino.fancymenu.api.visibilityrequirements.VisibilityRequirementRegistry;

@Mod("modid")
public class ExampleModMainClass {

    public ExampleModMainClass() {
        try {

            //Register your VisibilityRequirement to the VisibilityRequirementRegistry at mod init.
            //在模组初始化时把VisibilityRequirement注册到VisibilityRequirementRegistry。
            VisibilityRequirementRegistry.registerRequirement(new ExampleVisibilityRequirement());

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

}

创建带值的Requirement

创建VisibilityRequirement的新子类并取一个合适的名字。

接下来我将我的演示类命名为ExampleVisibilityRequirementWithValue

有一些重要的点需要留意

构造函数(Constructor)

构造函数用标识符独一无二

public ExampleVisibilityRequirementWithValue() {
    //The identifier needs to be unique! It's not possible to register multiple requirements with the same identifier!
    //标识符独一无二,别想着用同一个标识符注册多个 Requirements 。
    super("example_requirement_with_value");
}

hasValue()

这个方法用于返回 Requirements 是否需要值。

因为我们想给这个 Requirements 使用值,所以返回true。

@Override
public boolean hasValue() {
    //This requirement needs a value, so we return true here.
    // Requirements 需要值,返回true。
    return true;
}

isRequirementMet()

这是你的 Requirements 的最重要的方法。

这里用于返回是否满足在此要求中检查的条件。

这个方法有 Requirements 的值作为参数,所以你可以使用它检查是否满足 Requirements 。

//Here you return if the requirement is met (using the given requirement value if the requirement has one).
//在这里返回是否满足 Requirements (如果 Requirements 有值则返回 Requirements 的值)
//Since this requirement has a value, the value parameter will be the value of a requirement in a layout.
//因为 Requirements 有值,所以这个参数也绘世布局中 Requirements 的值。
@Override
public boolean isRequirementMet(@Nullable String value) {

    //This requirement has a value that can be any string, but the requirement will only be met if the value is "show_me".
    //此 Requirements 的值可以是任何字符串,但只有当值为“show_me”时才会满足 Requirements 。
    //We return true if the value is "show_me".
    if (value != null) {
        return value.equalsIgnoreCase("show_me");
    }

    return false;

}

getDisplayName()

此方法返回 Requirements 显示名。

这个显示名会在布局编辑器的Visibility Requirements选项显示。

//This is the display name of the requirement.
//这个是 Requirements 的显示名。
//You don't have much space for the display name, so try to choose a short one.
//显示名写得简短一些,因为太长会显示出错。
@Override
public String getDisplayName() {
    return "Example Requirement [With Value]";
}

getDescription()

返回 Requirements 的描述。

当把鼠标悬停在切换 Requirements 按钮上时,该描述会作为工具提示显示。

//This is the description of the requirement.
//这里是 Requirements 的描述
@Override
public List<String> getDescription() {
    List<String> l = new ArrayList<>();
    l.add("This is an example requirement");
    l.add("with a value.");
    l.add("It checks if the value is 'show_me'.");
    return l;
}

getValueDisplayName()

这个方法返回值的显示名。

//This is the display name of the VALUE of the requirement.
//这是 Requirements 的值的显示名。
//You don't have much space for the display name, so try to choose a short one.
//短短的进村,太长的不要!
@Override
public String getValueDisplayName() {
    return "Example Value Name";
}

getValuePreset()

如果没有真实的值,则返回自动设置到输入文本字段的内容。

最好给用户展示真实值的样例。

//This is the content that will be automatically set to the value input field when there is no value already.
//在已经没有值的情况下将自动设置到值输入栏的内容。
@Override
public String getValuePreset() {
    return "cool value preset";
}

getValueInputFieldFilter()

该方法返回一个字符过滤器,该过滤器被用来检查用户可以在数值输入文本字段中允许输入的字符。

如果你想允许所有字符,那直接返回null

//The character filter of the value input field. Return NULL if you want to allow all characters.
//值输入字段字符过滤器,返回null允许所有字符。
//Can be used to only allow numbers in the input field, etc.
//输入字段可以只允许数字等。
@Override
public CharacterFilter getValueInputFieldFilter() {
    return null;
}

完整示例

这是完整的VisibilityRequirement示例.

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

import de.keksuccino.fancymenu.api.visibilityrequirements.VisibilityRequirement;
import de.keksuccino.konkrete.input.CharacterFilter;

import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;

public class ExampleVisibilityRequirementWithValue extends VisibilityRequirement {

    public ExampleVisibilityRequirementWithValue() {
        //The identifier needs to be unique! It's not possible to register multiple requirements with the same identifier!
        //标识符独一无二,别想着用同一个标识符注册多个 Requirements 。
        super("example_requirement_with_value");
    }

    @Override
    public boolean hasValue() {
        //This requirement needs a value, so we return true here.
        //这个 Requirements 需要值,所以我们在这里返回true。
        return true;
    }

    //Here you return if the requirement is met (using the given requirement value if the requirement has one).
    //在这里返回是否满足 Requirements (如果 Requirements 有值则返回 Requirements 的值)
    //Since this requirement has a value, the value parameter will be the value of a requirement in a layout.
    //因为 Requirements 有值,所以这个参数也绘世布局中 Requirements 的值。
    @Override
    public boolean isRequirementMet(@Nullable String value) {

        //This requirement has a value that can be any string, but the requirement will only be met if the value is "show_me".
        //此 Requirements 的值可以是任何字符串,但只有当值为“show_me”时才会满足 Requirements 。
        //We return true if the value is "show_me".
        //如果值是"show_me"则返回true。
        if (value != null) {
            return value.equalsIgnoreCase("show_me");
        }

        return false;

    }

    //This is the display name of the requirement.
    //这个是 Requirements 的显示名。
    //You don't have much space for the display name, so try to choose a short one.
    //显示名写得简短一些,因为太长会显示出错。
    @Override
    public String getDisplayName() {
        return "Example Requirement [With Value]";
    }

    //This is the description of the requirement.
    //这里是 Requirements 的描述
    @Override
    public List<String> getDescription() {
        List<String> l = new ArrayList<>();
        l.add("This is an example requirement");
        l.add("with a value.");
        l.add("It checks if the value is 'show_me'.");
        return l;
    }

    //This is the display name of the VALUE of the requirement.
    //这是 Requirements 的值的显示名。
    //You don't have much space for the display name, so try to choose a short one.
    //显示名短短的进村,太长的不要!
    @Override
    public String getValueDisplayName() {
        return "Example Value Name";
    }

    //This is the content that will be automatically set to the value input field when there is no value already.
    //在已经没有值的情况下将自动设置到值输入栏的内容。
    @Override
    public String getValuePreset() {
        return "cool value preset";
    }

    //The character filter of the value input field. Return NULL if you want to allow all characters.
    //值输入字段字符过滤器,返回null允许所有字符。
    //Can be used to only allow numbers in the input field, etc.
    //输入字段可以只允许数字等。
    @Override
    public CharacterFilter getValueInputFieldFilter() {
        return null;
    }

}

注册Visibility Requirement

你弟任务!完成啦!啊哈哈哈哈哈哈哈哈哈哈哈哈

VisibilityRequirementVisibilityRequirementRegistry先生,Java陛下,我们在天堂(游戏加载)见!

package de.keksuccino.fancymenu;

import net.minecraftforge.fml.common.Mod;
import de.keksuccino.fancymenu.api.visibilityrequirements.VisibilityRequirementRegistry;

@Mod("modid")
public class ExampleModMainClass {

    public ExampleModMainClass() {
        try {

            //Register your VisibilityRequirement to the VisibilityRequirementRegistry at mod init.
            //在模组初始化时注册VisibilityRequirement到VisibilityRequirementRegistry。
            VisibilityRequirementRegistry.registerRequirement(new ExampleVisibilityRequirementWithValue());

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

}