咕咕咕
插件扔plugins,开服自动生成plugins/PyCall文件夹。
高速下载
将py编写的插件整个文件夹放入PyCall文件夹,开服。
示例插件 例如test插件
结构:
plugins/PyCall/
-test/
-test/main.py
-test/plugin.yml
plugin.yml大部分如nk的一样编写。
但是main项为“main.py:Test”,“入口文件:主类”,具体参考示例插件
首先需要编写主类Test并继承PluginBase
然后编写onLoad,onCommand等方法。如nk一样,command需要在plugin.yml注册,假设已经注册了一个testcmd指令。
接下来是注册事件
EventListener.registerEventListener(onjoin, PlayerJoinEvent)
细心的小伙伴可能发现了,怎么跟我写nk插件不一样呢,nk一般直接注册一个listener就好了呀?
因为平时用这种方法,处理event的函数需要写注解,但是Jython不支持java的注解,所以只能这样曲线救国了。
registerEventListener函数还可以写成registerEventListener(onjoin, PlayerJoinEvent, EventPriority.NORMAL, false)
后面两个代表优先级和是否忽略取消(选填),如平时的注解需要填写那样。
目前我就测试了这么多,更多功能后续开发(毕竟我一天半随便瞎写出来的)。
结构:
plugins/PyCall/
-test/
-test/main.py
-test/plugin.yml
plugin.yml大部分如nk的一样编写。
但是main项为“main.py:Test”,“入口文件:主类”,具体参考示例插件
首先需要编写主类Test并继承PluginBase
Python:
from cn.nukkit.plugin import PluginBase
class Test(PluginBase):
pass
然后编写onLoad,onCommand等方法。如nk一样,command需要在plugin.yml注册,假设已经注册了一个testcmd指令。
Python:
from cn.nukkit.plugin import PluginBase
class Test(PluginBase):
def onLoad(self):
pass
def onEnable(self):
self.getLogger().info("哭嘤嘤")
def onCommand(self, sender, command, label, args):
if command.getName() == "testcmd":
sender.sendMessage("123")
return 1
接下来是注册事件
EventListener.registerEventListener(onjoin, PlayerJoinEvent)
Python:
from cn.nukkit.plugin import PluginBase
from cn.nukkit.event.player import PlayerJoinEvent
from net.soeur.pycall import EventListener
class Test(PluginBase):
def onEnable(self):
EventListener.registerEventListener(onjoin, PlayerJoinEvent)
def onjoin(event):
event.getPlayer().sendMessage("hello world")
因为平时用这种方法,处理event的函数需要写注解,但是Jython不支持java的注解,所以只能这样曲线救国了。
registerEventListener函数还可以写成registerEventListener(onjoin, PlayerJoinEvent, EventPriority.NORMAL, false)
后面两个代表优先级和是否忽略取消(选填),如平时的注解需要填写那样。
目前我就测试了这么多,更多功能后续开发(毕竟我一天半随便瞎写出来的)。
在控制台输出信息的时候,如果使用python来输出如print,则需要
sb windows的锅,都老老实实utf8不好么。
如果是使用getLogger().xxx("xxxxx"),则不需要(我暴力怼了一下Logger)。
Python:
from utf8_gbk import utf8togbk
print utf8togbk("因为windows控制台编码是ms936, 所以utf8字符需要转成gbk编码")
如果是使用getLogger().xxx("xxxxx"),则不需要(我暴力怼了一下Logger)。
1,与java交互时字符串编码爆炸,原因是jython在把python的字符串转成java的字符串的时候,写死了字符串编码成ISO-8859-1,因此直接把字符串传递给java的时候,java没有转会utf8,编码爆炸。插件的Logger除外,我魔改过。带来的后果是传递给java的字符串中的中文乱码。此问题历时一天半无解,容后解决。
2,本插件自带的py部分标准库是Jython的,不是python2.7全部原生标准库。因此部分功能无法使用,如io库里没有ByteIO,造成无法使用依赖此功能的urllib3,无法使用urllib3就无法使用依赖此库的requests。
2,本插件自带的py部分标准库是Jython的,不是python2.7全部原生标准库。因此部分功能无法使用,如io库里没有ByteIO,造成无法使用依赖此功能的urllib3,无法使用urllib3就无法使用依赖此库的requests。
第一次使用插件的时候会自动在plugins/PyCall下生成Jython/Lib文件夹,生成plugins/PyCall/load_lib.lock文件。
如果Jython文件夹不存在或plugins/PyCall/load_lib.lock文件不存在,会重新生成lib。
Jython/Lib包含了一部分p.ython2.7的非原生标准库。
如果插件文件夹下包含lib/,则此文件夹也包含在lib path中,方便插件自带第三方库。
如plugins/PyCall/test/lib/test_lib,test_lib为test插件独有的自带第三方库。其他插件lib path中不包含其他插件自带的第三方库。
如果Jython文件夹不存在或plugins/PyCall/load_lib.lock文件不存在,会重新生成lib。
Jython/Lib包含了一部分p.ython2.7的非原生标准库。
如果插件文件夹下包含lib/,则此文件夹也包含在lib path中,方便插件自带第三方库。
如plugins/PyCall/test/lib/test_lib,test_lib为test插件独有的自带第三方库。其他插件lib path中不包含其他插件自带的第三方库。
因为python相比java更加方便,简洁,易于快速开发
因为插件里自带了一部分p♂ython2.7的非原生标准库
[LINE]欢迎各位参与开发,测试/解决bug[/LINE]