BlocklyNukkit WIKI

这里是BN百科

章节导览


自动寻路NPC


示例下载地址

源代码

# -*- coding: UTF-8 -*-  
# pragma Python  
import json  
import random  
import cn.nukkit.level.Position as POS #引入nk的坐标模块  
def isChinese(): #检查服务器语言是否为中文  
    return u"中文" in server.getLanguage().getName()  
logger.info(u"自动烟花插件加载完成" if isChinese() else u"autoFireWork plugin successfully loaded!") #加载完成提示  
manager.createPermission("autoFireWork.All","autoFireWork Permission","OP") #创建权限组autoFireWork.All,默认给op  
manager.createCommand("fire",u"自动烟花设置" if isChinese() else u"autoFireWork settings","autoFireWorkCall","autoFireWork.All")#注册命令fire,autoFireWorkCall是命令回调函数  
text = manager.readFile("./plugins/autoFireWork/config.json") #通过bn的manager模块读取文件,其实用python的open也可以,看个人喜好  
if text == "FILE NOT FOUND": # 如果没有文件  
    manager.writeFile("./plugins/autoFireWork/config.json","[]")  
    text = "[]"#设置json文件为空数组  
config = json.loads(text)#解析json  
manager.createLoopTask("dotickFireWork",1) #注册循环命令调用,每tick调用一次dotickFireWork  
def dotickFireWork(tick):  
    for entry in config: #对于config数组的每一项执行判断  
        if tick%entry['interval'] == 0: #判断是否此时应该调用  
            mkfirewordk(entry['rule']) #将规则传给执行函数  
def mkfirewordk(ruleEntry): #执行烟花燃放的函数  
    ruleEntry = ruleEntry.replace(" ",'') #先去掉空格  
    group = ruleEntry.split(";") #按照分号分隔开规则字符串便于解析  
    pos = server.getDefaultLevel().getSpawnLocation() #获取服务器默认世界的重生点,这里调用了nukkit,具体的可以前往nukkitAPI或者看编程开发文档  
    color = random.randint(0,15) #颜色变量,默认随机颜色  
    flick = False #是否闪烁  
    trail = False #是否曳尾  
    shape = random.randint(0,4) #形状码变量,默认随机形状  
    time = random.randint(0,3) #飞行时间长度变量,默认随机长度  
    for each in group: #开始对之前按照;分割的规则字符串解析  
        if each.startswith('pos'): #这是位置逻辑组件  
            each = each.replace("pos:","")  
            tmpgroup = each.split(":")  
            pos = POS.fromObject(manager.buildvec3(float(tmpgroup[0]),float(tmpgroup[1]),float(tmpgroup[2])),server.getLevelByName(tmpgroup[3]))#调用nukkit函数创建一个postition四维坐标类型变量  
        elif each.startswith('color'): #这是颜色逻辑组件  
            each = each.replace("color:","").replace("black","0").replace('red',"1").replace('green','2').replace("brown",'3').replace("blue",'4').replace("purple","5")  
            each = each.replace("cyan","6").replace("lightgrey","7").replace("grey","8").replace('pink','9').replace('lightyellow','10').replace('yellow','11').replace('lightblue','12')  
            each = each.replace("magenta",'13').replace("orange",'14').replace('white','15') #将英文替换为相应的数字  
            color = int(each) #字符串转为数字  
        elif each == 'flick': #闪烁逻辑组件  
            flick = True  
        elif each == "trail": #曳尾逻辑组件  
            trail = True  
        elif each.startswith("shape"): #形状逻辑组件  
            each = each.replace("shape:","").replace('smallball',"0").replace("bigball",'1').replace("star","2").replace('creeper','3').replace("burst",'4')  
            #英文替换为形状码,具体的可以查询bn编程开发文档  
            shape = int(each) #字符串转整数  
        elif each.startswith("time"): #时间长度逻辑组件  
            each = each.replace("time:","") #去掉time:  
            time = int(each) #字符串转整数  
    particle.drawFireWork(pos,color,flick,trail,shape,time) #调用粒子基对象的绘制烟花函数  
def removecall(event): #删除规则窗口回调函数  
    ruleentry = window.getEventCustomVar(event, 1, "dropdown").replace(u';',';') #因为规则窗口按照英文;分割,所以我们把;转为;来避免这个问题  
    pl = event.getPlayer() #获取事件的玩家  
    for x in config: #遍历查找config里面哪一项是我们要删除的  
        if ruleentry == x['rule']:  
            config.remove(x)#移除掉这个  
            pl.sendMessage(u"§a规则"+ruleentry+u"成功移除" if isChinese() else u"§arule "+ruleentry+u" has been removed")#发出提示,这里判断一下是否是中文环境  
            manager.writeFile("./plugins/autoFireWork/config.json",json.dumps(config)) #把修改完的json再写回文件,这里用了bn的写文件函数,你也可以用python的  
def autoFireWorkCall(sender,args):  
    if not sender.isOp(): #玩家不是op的话,提示玩家没有权限,提前使用return结束函数  
        sender.sendMessage(u"§c你没有权限使用此命令" if isChinese() else u"§cYou do not have the permission to use this command")  
        return  
    if len(args)<1: #如果命令不对的话,提示玩家参数太少,提前使用return结束函数  
        sender.sendMessage(u"§c命令参数太少了" if isChinese() else u"§cToo few arguments!")  
        return  
    if args[0] == "delete" or args[0] == 'remove': #移除烟花规则命令  
        bd = window.getCustomWindowBuilder(u'移除自动烟花规则' if isChinese() else u'remove autoFireWork rules') #bd为一个自定义窗口builder,标题为移除自动烟花规则  
        bd.buildLabel(u'选择一条规则进行移除' if isChinese() else "Select a rule to remove")  
        bd.buildDropdown(u'自动烟花规则' if isChinese() else u'autoFireWork rules',''.join(i['rule'].replace(";",u";")+";" for i in config))#把config里面的每一项规则都通过英文分号连接起来  
        bd.showToPlayer(server.getPlayer(sender.getName()),'removecall') #发送给玩家,并且设置回调函数为removecall  
    else: #否则就是添加新的烟花规则  
        rules = args[1] if len(args)>1 else ""  
        config.append({"interval":int(args[0]),"rule":rules}) #在config里面添加新的一项烟花规则  
        manager.writeFile("./plugins/autoFireWork/config.json",json.dumps(config)) #写入新的烟花规则  
        sender.sendMessage(u"§a成功添加新的自动烟花规则!" if isChinese() else u"§aSuccessfully added a new autoFireWork rule!")  

不满意?前往编辑此页面

导航