zh
切换语言
  1. PowerNukkitX
  2. 快速入门
  3. 服务器配置

    1. server.properties
    2. nukkit.yml
    3. pnx-cli-config.ini
    4. 反矿透
    5. 资源包加密
    6. 硬件加速压缩
    7. 使用WaterDogPE
    8. 超平坦世界
  4. FAQ

    1. 新人必看
    2. PNX-CLI教程
    3. 常见问题
    4. Terra问题
    5. 重生点问题
    6. 转换地图
  5. 开发者文档

    1. Java

      1. 跳转到JavaDoc
      2. Mod API

        1. 自定义方块
        2. 自定义物品
        3. 自定义实体
        4. 自定义附魔
      3. 生物AI

        1. 行为
        2. 记忆
        3. 传感器
        4. 运动控制器
        5. 寻路器
        6. 行为组
        7. 工作周期
    2. JavaScript

      1. 配置开发环境
      2. 基于LLSELib开发
      3. Hello World
      4. 基本知识
      5. 事件监听
      6. 常见开发问题
    3. API

      1. 简介
      2. 通用API
      3. Git-API
      4. 下载API
      5. 延迟返回API
      6. 插件API
    4. 实用资源

      1. 事件对照表
      2. 物品方块ID

常见开发问题

1. invokeMember (getDamager) on cn.nukkit.event.entity.EntityDamageEvent failed due to: Unknown identifier: getDamager

这是由于错误地把EntityDamageEvent事件当作EntityDamageByEntityEvent并执行了getDamager方法造成的,通常 是由于监听了cn.nukkit.event.entity.EntityDamageByEntityEvent,但是部分插件会混发事件造成的。

解决方法:使用instanceof在事件回调函数中判断事件种类。

import { PowerNukkitX, EventPriority } from ":powernukkitx";
import { EntityDamageByEntityEvent } from "cn.nukkit.event.entity.EntityDamageByEntityEvent";

PowerNukkitX.listenEvent("cn.nukkit.event.entity.EntityDamageByEntityEvent", EventPriority.NORMAL, e => {
    if (e instanceof EntityDamageByEntityEvent) {
        // ......
    }
})

2. Server.getLevel返回null

通常是由于以下两个问题造成的:

3. 导入其他JS插件的模块时的一些注意事项

PNXJS的每个JS插件都是一个独立的Context,这意味着,如果你使用import导入其他插件的模块时,会完全重新载入一次被导入的插件的模块。
例如以下基于LLSE-Lib库编写的示例:

观察以下代码,按照NK插件加载规则,APlugin插件会在BPlugin插件之前加载
APlugin.js

export var A;
console.log("this is A plugin");
onlyOnceExecute(()=>{
    A=123;
},"FCA1A72C-B62C-F6E6-1D49-4B1B5B0BC40C");

BPlugin.js

import {A} from "APlugin.js";
console.log(A);

其中APlugin.js中的console.log("this is A plugin");会被执行两次,在加载APlugin时会输出一次,再加载BPlugin时,由于B插件导入了APlugin插件的A变量,这会在B插件的Context完全载入一次A插件,即又输出一次。

而其中的onlyOnceExecute来自LLSE-Lib库,就是为了解决该问题出现的。 onlyOnceExecute第一个参数传入一个回调函数,第二个参数传入一个UUID作为唯一标识符,这个回调函数只会执行一次,不管多少个插件导入该插件。

但是由于PNXJS的每个JS插件都是一个独立的Context,所以B插件导入了APlugin插件的A变量,A变量是没有初始化的,同时B插件的Context完全载入一次A插件,但是由于onlyOnceExecute全局只会执行一次,所以A变量在B插件的Context不会被初始化


© PowerNukkitX 开发组