如何安装插件就不说了,咱们来进入正题。 打开Scriptful文件夹,下面空空如也,我们创建一个hello.js。里面写入
服务器控制台是不是输出了hello world? 经过多年的编码已经成为老司机的你,是不是找到初次写代码的感觉? |
写插件没有监听器,怎么行? 创建chat.js,里面写入
这里出现了“self”,这是一个非常重要的东西,有了它,我们可以做和java插件一样的事情,我们以后继续讨论。 那个priority.normal其实是偷懒用的,一共有priority.lowest, priority.low, priority.normal, priority.high, priority.highest, priority.monitor。 更懒的境界是不写priority项,默认normal。不过event和handle还是一定要写的。 |
没有指令也不行,接下来接受指令。 创建cmd.js,里面写入
ok,那是因为我懒,executor有四个参数,并返回一个布尔值(和bukkit原来的一样) 别的一看就懂了,懒人都是聪明人。 其实除了name以外。。其他变量都可以不assign。。 |
有人可能觉得,把所有东西放一个文件里可能太降san值了,需要更多文件方便arrange代码。 行,满足你这个愿望。通过观察,你可以发现,我们一个插件对应一个文件,脚本后缀决定类型,要怎么搞? 我们知道,java文件编译得到一个class文件, 但我们可以把它们放进一个jar文件中。 同理,我们把脚本放进压缩包里(目前支持.zip,.gzip,.gz)。 比如,创建一个multiple.zip,先把1.2(chat.js)与1.3(cmd.js)的代码放进去。 如果你Scriptful目录下没删除chat.js与cmd.js,那请先把他们删了,以免影响结果。 现在multiple.zip里有两个js文件,但是如果我们这时运行,他们将不会被加载(你可以运行服务端试试)。 为了让他们加载,你需要再往multiple.zip添加一个文件,名为main.js(或者multiple.js也可以),内容如下:
注意self.include只有压缩包类插件可以调用,脚本文件类插件不行。 |
你认为只可以用js来写插件?当然不是! 你可以用一切有java引擎支持的脚本语言来写,比如python。 就拿python举例吧,首先我们需要一个叫jython的东西:https://sourceforge.net/projects/jython。 把里面的jython.jar解压出来,然后你可以:
运行服务端,你会看到本插件输出“Supported languages:”,比如“Supported languages: .lua, js, lua, py” 输出内容为支持的脚本类型,比如上面输出代表支持lua,javascript与python。 创建commandpy.py,里面写入:
|
写到现在,你一定有疑问,如果如果脚本内容为Java插件的onEnable方法的内容,那么onDisable的内容应该写到哪? |
想必写插件的各位对Scheduler不会感到陌生。 在Java插件中,我们getServer().getScheduler()并Scheduler用的方法注册任务。 在脚本插件中,我们用self.schedule()注册任务。请看以下代码:
|
2016-08-29 20:35:00
XIAOMM 发表于 2016-8-29 20:29
完全告别JAVA的前提,先告别JAVA版的MC。
所以来玩C++的Win10版吧(滑稽)
2016-08-29 20:41:00
2016-08-29 20:45:00
堕星辰 发表于 2016-8-29 21:35
支持原创!
不过冒昧问一句
我想知道和Skript的差别是?
2016-08-29 21:31:00
CustomStuff2 发表于 2016-8-29 14:31
http://njol.ch/projects/skript/ Skript is a plugin for Bukkit, a popular Minecraft server mod. It ...
2016-08-29 23:07:00
2016-08-29 23:27:00
andylizi 发表于 2016-8-30 10:56
我突然想到有没有可能把js代码转换为原生bukkit插件
2016-08-30 12:51:00
CustomStuff2 发表于 2016-8-30 12:51
导出bytecode弄进jar里么233333
2016-08-30 12:53:00
2016-08-30 14:26:00
爱琴炫彩 发表于 2016-8-30 14:26
看起来很不错! 那么效率如何呢?
比如监听了比如ItemMove的事件,那么最终的调用过程会是怎样的?
2016-08-30 15:42:00
andylizi 发表于 2016-8-30 18:09
诶等等我发现一件事诶
监听器的定义里怎么没有ignoreCancelled
2016-08-30 18:33:00
jebme 发表于 2016-9-3 06:50
支持姆书记。
使用前置呢?比如Vault PL....
2016-09-03 14:31:00
qq245271830 发表于 2016-9-10 12:12
要是不会java是不是就不能用了啊
2016-09-10 19:01:00
CustomStuff 发表于 2016-9-10 19:01
如果是程序员会js且会看javadoc即可,如果是服主两样都不用会
2016-09-11 01:03:00
2016-12-11 11:53:00
andylizi 发表于 2016-12-11 11:53
还有一个极其严重的bug:假设你监听 EntityDamageByEntityEvent ,那么它的父类 EntityDamageEvent 也能触 ...
2016-12-11 22:46:00
117779284 发表于 2016-12-11 20:04
1.7MOD服确实不能用
2016-12-11 22:47:00
CustomStuff2 发表于 2016-12-11 22:47
如何不能用法,至少要像楼上上的梨子一样,给个截图之类的。
2016-12-11 23:59:00
CustomStuff2 发表于 2016-12-12 00:32
喔,你是梨子今天说的那个服主么。
我猜这个可能和jre有关(没有js引擎),你可以尝试。
2016-12-12 00:25:00
117779284 发表于 2016-12-11 23:59
[Scriptful] LoadFail
java.lang.Exception: No engine for js
at net.aegistudio.scriptful.Scriptful. ...
2016-12-12 00:32:00
117779284 发表于 2016-12-12 00:25
1.10测试是正常的
1.7.10不可以的·
确实是不可以吧。。我也只是实验一下1.8以下是否支持。
2016-12-12 11:57:00
CustomStuff2 发表于 2016-12-12 11:57
wait!
为啥1.10下能跑而1.7.10下不能,你运行两个服务器用的是同一个jre嘛?
2016-12-12 17:13:00
2019-12-08 10:17:00