Skip to content

脚本工具/导包

在AttributePlus文件夹内,存在一个名为 script.yml 的文件,打开后我们可以看到:

YAML
#脚本工具(CatServer / Mohist 核心不支持自定义工具)
#格式为 [占位符: 类] 如果不懂,请不要自己修改
scriptTools:
  "Utils": "org.serverct.ersha.script.AttrScriptUtils"
  "AttributeAPI": "org.serverct.ersha.api.AttributeAPI"
  "Bukkit": "org.bukkit.Bukkit"
  "EntityType": "org.bukkit.entity.EntityType"
  "Arrays": "java.util.Arrays"

存在 5 个已经配置好的配置,对应“方法大全”和“方法大全2”中的文档。若你看了那些文档,那你现在大概已经懂了。

在配置中,我们可以看到以 "Utils": "org.serverct.ersha.script.AttrScriptUtils"这样的格式进行导入。
这样就可以像 “方法大全”→Utils 中所说的一样,使用如 Utils.registerOtherAttribute(...) 就可以调用 org.serverct.ersha.script.AttrScriptUtils 中的对应静态方法了。

且配置中的注释以及告知配置格式为:占位符: 类
继续拆解"Utils": "org.serverct.ersha.script.AttrScriptUtils",很容易得知,"Utils" 是占位符,"org.serverct.ersha.script.AttrScriptUtils"是类。

占位符

占位符并非类名,但一般写为类名。比如 "Bukkit": "org.bukkit.Bukkit" 这更加方便我们维护。
它在JavaScript中的使用就是方法 Bukkit.方法名(),当然也可以像 "Utils" 一样自由定义占位符名。
它只是一个对应关系。

这里的“类”

这里的“类”,是这个类的完整路径,在 “方法大全2”→Bukkit和基础 已有详细介绍。

静态方法

只能使用对应类中的静态方法,也就是 static 修饰的方法。在 “方法大全2”→Bukkit和基础 已有详细介绍。

实例方法

有时,我们想使用的示例方法,比如我们想使用MythicMobs-4.11这个插件释放一个技能。
我们通过反编译手段可以看到 io.lumine.xikage.mythicmobs.MythicMobs 这个类中有一个 getAPIHelper() 的方法,它返回一个 BukkitAPIHelper 的实例(对象)。

Java
public BukkitAPIHelper getAPIHelper() {
    return this.APIHelper;
}

BukkitAPIHelper 中又有一个 castSkill(Entity e, String skillName) 的方法,他可以帮助我们使一个实体放技能。

Java
public boolean castSkill(Entity e, String skillName) {
    return this.castSkill(e, skillName, e.getLocation(), 1.0F);
}

public BukkitAPIHelper getAPIHelper() 这个方法并不是 static 修饰的(没有在方法名前出现 static 字眼),我们无法直接使用。这怎么办呢?

我们继续在 MythicMobs 类中查找,发现inst() 会返回这个类的示例(对象)本身,并且它是一个静态方法(在方法名前出现了 static 字眼)

Java
private static MythicMobs plugin;

public static MythicMobs inst() {
    return plugin;
}

所以!
我们可以使用 MythicMobs.inst() 这个方法获得一个 MythicMobs 的实例(对象),然后再调用它的 getAPIHelper() 这个实例方法获得一个 BukkitAPIHelper 实例(对象),然后再用这个实例调用它自己的 castSkill(Entity e, String skillName) 这个实例方法。

串起来就是:MythicMobs.inst().getAPIHelper().castSkill(Entity e, String skillName)
我们发现这段代码只用到了 MythicMobs 这个类作为脚本占位符,所以我们需要导如这个类。

YAML
scriptTools:
  "Utils": "org.serverct.ersha.script.AttrScriptUtils"
  "AttributeAPI": "org.serverct.ersha.api.AttributeAPI"
  "Bukkit": "org.bukkit.Bukkit"
  "EntityType": "org.bukkit.entity.EntityType"
  "Arrays": "java.util.Arrays"
  #顺着向下写
  "MythicMobs": "io.lumine.xikage.mythicmobs.MythicMobs"

我们直接在属性中使用

JavaScript
function runAttack(attr, attacker, entity, handle) {
    MythicMobs.inst().getAPIHelper().castSkill(attacker, "技能名")
    return true
}

TIP

这只是一个例子,不代表所有的类中都会有 inst() 或类似的方法获得实例(对象)。
但大部分情况下都可以找到一样或类似的方法获得某个类的实例(对象)。
一般来说只有少数情况需要在我们编写属性时去实例化,具体可以查看 编程进阶

注意

导包之后需要重启才能生效。