脚本工具/导包
在AttributePlus文件夹内,存在一个名为 script.yml
的文件,打开后我们可以看到:
#脚本工具(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
的实例(对象)。
public BukkitAPIHelper getAPIHelper() {
return this.APIHelper;
}
BukkitAPIHelper
中又有一个 castSkill(Entity e, String skillName)
的方法,他可以帮助我们使一个实体放技能。
public boolean castSkill(Entity e, String skillName) {
return this.castSkill(e, skillName, e.getLocation(), 1.0F);
}
但 public BukkitAPIHelper getAPIHelper()
这个方法并不是 static
修饰的(没有在方法名前出现 static
字眼),我们无法直接使用。这怎么办呢?
我们继续在 MythicMobs
类中查找,发现inst()
会返回这个类的示例(对象)本身,并且它是一个静态方法(在方法名前出现了 static
字眼)
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
这个类作为脚本占位符,所以我们需要导如这个类。
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"
我们直接在属性中使用
function runAttack(attr, attacker, entity, handle) {
MythicMobs.inst().getAPIHelper().castSkill(attacker, "技能名")
return true
}
TIP
这只是一个例子,不代表所有的类中都会有 inst()
或类似的方法获得实例(对象)。
但大部分情况下都可以找到一样或类似的方法获得某个类的实例(对象)。
一般来说只有少数情况需要在我们编写属性时去实例化,具体可以查看 编程进阶。
注意
导包之后需要重启才能生效。