Skip to content

MonsterPlaceholder

MonsterPlaceholder是从MonsterAPI-2.x版本开始支持的一个内置变量系统,它可以在任何支持的地方使用这个变量系统 在MonsterAPI-3.x完全重写,本文档基于3.0.1版本

PlaceholderAPI兼容

使用 %monsterapi_mp_$变量$% 来使用 MonsterPlaceholder

使用格式

这只是一个官方推荐格式,也是官方变量的使用标准
使用 $ap3:物理攻击.def@u$或$ap3:物理攻击$ 来引用变量
官方变量一般由4个部分组成,格式为 $唯一标识符:数据.附加数据@目标$
也可以是一个 $唯一标识符:数据$ 的格式,因为官方变量会在解析前自动为你填入附加数据和目标

官方工具

这不是一个硬性要求的格式,但更推荐使用这个格式
如果你需要使用 JavaScript 变量和开发附属那么你需要阅读此部分

部分描述使用工具默认值
唯一标识符id必须在后面加一个:否则变量无法使用必填内容
关键词基本的数据必须写在:的右边必填内容
附加数据额外附加的数据在数据的后面使用.来区分附加数据def
目标变量解析的目标在最后使用一个@?代表目标u
目标描述
uuser 使用者
ttarget 被使用者
其他其他变量支持的目标

TIP

唯一标识符必须唯一
官方工具获取的任何数据都不包含任何分割符
附加数据可以是x.x.x的格式
官方工具时可以通过getAt()获取@后的任意字符

官方变量

变量描述
Bukkit变量
$bukkit:health.max$最大生命值
$bukkit:health.lose$失去的生命值
$bukkit:health.now$当前生命值
$bukkit:health$当前生命值
$bukkit:level$玩家当前等级
MonsterAPI变量
$monsterapi:randomvalue.[最小值].[最大值]$随机数
$monsterapi:rv.[最小值].[最大值]$随机数
$monsterapi:math.[自定义公式]$计算
$monsterapi:data.[key]$EntityData中的数据
AttributePlus变量
$ap3:[属性名].max$最大属性值
$ap3:[属性名].min$最小属性值
$ap3:[属性名].random$随机属性值
$ap3:[属性名]$min-max 范围属性值
SkillAPI变量
$sapi:value.[key]$value存储值
$sapi:skilllevel.[技能名]$技能等级
$sapi:attribute.[属性名]$属性值
$sapi:attribute.point$属性点
$sapi:flag.[key]$flag值
$sapi:flagtime.[key]$flag剩余时间

在脚本中注册变量

JavaScript
//$hp:percent.2$
var identifier = "hp"
var author = "MonsterXZ"
var tips = "百分比血量"
var version = "1.0.0"

function parse(utils, user, target) {
    /*
      utils 解析工具
      key $identifier:key.data@u$中key的部分
      data $identifier:key.data@u$中data的部分
      entity 自动通过@?获取的目标
    */
    var key = utils.getKey()
    if(key.equals("percent")){
        var data = utils.getData()
        var entity = utils.getEntity()
        var args = data.split(".")

        if(entity.getHealth() > 0){
            if(args[0].equals("number")){
                return (user.getHealth() / 100).toFixed(parseInt(args[1])) + "%"
            }
            if(args[0].equals("icon")){
                var icon = args[1]
                var string = ""
                var have = entity.getHealth() / entity.getMaxHealth() * 10
                var lose = 10 - have - 1
                for (var i = 0; i < have-1; i++) {
                    string += "§a" + icon
                }
                if(have != 10) string += "§7" + icon
                for (var i = 0; i < lose; i++) {
                    string += "§f" + icon
                }
                return string
            }
        }
    }
    return ""
}

在插件中注册变量

Java
public class Example extends SubMPlaceholder {

    //唯一标识符,一般是插件名或缩写
    @Override
    public String getIdentifier() {
        return "Example";
    }
    
    //作者
    @Override
    public String getAuthor() {
        return "MonsterXZ";
    }
    
    //提示或介绍,尽可能简短
    @Override
    public String getTips() {
        return "一个例子";
    }
    
    //变量版本
    @Override
    public String getVersion() {
        return "1.0.0";
    }

    //传递的参数是由$括起来的完整变量
    //不需要操作变量中的{...} 它会自动通过MPlaceholder解析
    @Override
    public String parse(LivingEntity user, LivingEntity target, String params) {
        /*
          utils 解析工具
          key $identifier:key.data@u$中key的部分
          data $identifier:key.data@u$中data的部分
          entity 自动通过@?获取的目标
        */
        MPlaceholderUtils utils = new MPlaceholderUtils(user, target, params);
        String key = utils.getKey();
        String data = utils.getData();
        LivingEntity livingEntity = utils.getEntity();
        if(key.equalsIgnoreCase("health")){
            switch (data) {
                case "now":
                case "def":
                    return livingEntity.getHealth() + "";
                case "max":
                    return livingEntity.getMaxHealth() + "";
                case "lose":
                    return (livingEntity.getMaxHealth() - livingEntity.getHealth()) + "";
             }
       }
       return "0";
    }
       
}