PyCall-p♂ython写nk插件(咕咕咕)

Plugins PyCall-p♂ython写nk插件(咕咕咕) 2019-04-12

Source of resources
Original
Copyright link
#
API
0.0.0
Language
English
3166


咕咕咕
插件扔plugins,开服自动生成plugins/PyCall文件夹。
高速下载

将py编写的插件整个文件夹放入PyCall文件夹,开服。
示例插件 例如test插件
结构:
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")
细心的小伙伴可能发现了,怎么跟我写nk插件不一样呢,nk一般直接注册一个listener就好了呀?
因为平时用这种方法,处理event的函数需要写注解,但是Jython不支持java的注解,所以只能这样曲线救国了。
registerEventListener函数还可以写成registerEventListener(onjoin, PlayerJoinEvent, EventPriority.NORMAL, false)
后面两个代表优先级和是否忽略取消(选填),如平时的注解需要填写那样。

目前我就测试了这么多,更多功能后续开发(毕竟我一天半随便瞎写出来的)。
在控制台输出信息的时候,如果使用python来输出如print,则需要
Python:
from utf8_gbk import utf8togbk

print utf8togbk("因为windows控制台编码是ms936, 所以utf8字符需要转成gbk编码")
sb windows的锅,都老老实实utf8不好么。
如果是使用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。
第一次使用插件的时候会自动在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中不包含其他插件自带的第三方库。
为什么使用python
因为python相比java更加方便,简洁,易于快速开发
为什么插件体积这么大
因为插件里自带了一部分p♂ython2.7的非原生标准库

[LINE]欢迎各位参与开发,测试/解决bug[/LINE]
  • Like
Reactions: 277338986 and YYT
Author
橘子
Price
44金粒
Downloads
13
Views
1,500
First release
Last update
Rating
5.00 star(s) 4 ratings

Share this resource

Latest updates

  1. 谁看到谁是?
  2. 咕咕咕

    咕咕咕啦

Latest reviews

你好6啊
滋呲一下咯
很棒的想法,但是作者说好的后续功能呢,弃坑了吗,嘤嘤嘤
橘子
橘子
嘤嘤嘤
假装看不到我