索引

前言

目录

帮助文档
一、说明
二、API接口定义
 1.通用数据处理及网络功能
 2.MC核心玩法相关功能
 3.MC玩家互动相关功能
三、注册机制
 1.注册范例
 2.所有事件
四、杂项

前言

  梦之故里的JS插件运行平台(JSRunner)的换皮版 —— BDSJSR2。适配最新版BDSNetRunner,相对c++版略有改动。

目录

一、说明
二、API接口定义
三、注册机制
四、杂项

帮助文档

一、说明

本插件平台使用v8引擎作为js解释执行工具。全程采用监听器注册机制以完成特定事件的处理。
插件基本运作原理:hook bds事件点位 -> 修改内存属性/转v8虚拟机执行事件处理代码 -> 取结果决定是否拦截/继续执行。
使用之前,请确保您已了解了js本地对象和内置对象相关内容及JSON相关语法。js基本数据及函数参考手册详见
https://www.w3school.com.cn/jsref/index.asp
中的《JavaScript 对象参考手册》章节。

二、API接口定义

1.通用数据处理及网络功能

(1)fileReadAllText

// 函数名:fileReadAllText
// 功能:文件输入流读取一个文本
// 参数个数:1个
// 参数类型:字符串
// 参数详解:fname - 文件路径(相对BDS位置)
// 返回值:字符串

[例] let t = fileReadAllText('outjs.js')

(2)fileWriteAllText

// 函数名:fileWriteAllText
// 功能:文件输出流全新写入一个字符串
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:fname - 文件路径(相对BDS位置),content - 文本内容
// 返回值:是否写成功

[例] let w = fileWriteAllText('jslog.txt', '测试字符')

(3)fileWriteLine

// 函数名:fileWriteLine
// 功能:文件输出流追加一行字符串
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:fname - 文件路径(相对BDS位置),content - 追加内容
// 返回值:是否写成功

[例] let w = fileWriteLine('jslog.txt', '下一行测试字符')

(4)fileExists

// 函数名:fileExists
// 功能:判断文件是否存在
// 参数个数:1个
// 参数类型:字符串
// 参数详解:fname - 文件路径(相对BDS位置)
// 返回值:True - 文件存在,False - 文件不存在

[例] let e = fileExists('config.json')

(5)fileDelete

// 函数名:fileDelete
// 功能:删除指定文件
// 参数个数:1个
// 参数类型:字符串
// 参数详解:fname - 文件路径(相对BDS位置)
// 返回值:True - 删除文件成功,False - 删除失败

[例] let e = fileDelete('jslog.txt')

(6)fileCopy

// 函数名:fileCopy
// 功能:复制指定文件
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:from - 待复制的文件路径(相对BDS位置),to - 目标位置(相对BDS位置)
// 返回值:True - 复制文件成功,False - 复制失败

[例] let w = fileCopy('jslog.txt', '.\\log\\output.log)

(7)fileMove

// 函数名:fileMove
// 功能:移动指定文件
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:from - 待移动的文件路径(相对BDS位置),to - 目标位置(相对BDS位置)
// 返回值:True - 移动文件成功,False - 移动失败

[例] let w = fileMove('jslog.txt', '.\\log\\output.log)

(8)dirCreate

// 函数名:dirCreate
// 功能:创建文件夹
// 参数个数:1个
// 参数类型:字符串
// 参数详解:dirname - 待创建的文件夹路径(相对BDS位置)
// 返回值:True - 目录创建成功/已存在,False - 创建失败

[例] let r = dirCreate('C:\\newdir')

(9)dirExists

// 函数名:dirExists
// 功能:判断文件夹是否存在
// 参数个数:1个
// 参数类型:字符串
// 参数详解:dirname - 文件夹路径(相对BDS位置)
// 返回值:True - 文件夹存在,False - 文件夹不存在

[例] let e = dirExists('C:\\config')

(10)dirDelete

// 函数名:dirDelete
// 功能:删除指定文件夹,如果其中有内容将一并删除
// 参数个数:1个
// 参数类型:字符串
// 参数详解:dirname - 文件夹路径(相对BDS位置)
// 返回值:True - 删除文件夹成功,False - 删除失败

[例] let e = dirDelete('C:\\config')

(11)dirMove

// 函数名:dirMove
// 功能:移动指定文件夹
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:from - 待移动的文件夹路径(相对BDS位置),to - 目标位置(相对BDS位置)
// 返回值:True - 移动文件夹成功,False - 移动失败

[例] let w = dirMove('C:\\config', 'C:\\bak\\conf)

(12)systemCmd

// 函数名:systemCmd
// 功能:调用系统命令提示符执行系统命令
// 参数个数:2个
// 参数类型:字符串,函数对象
// 参数详解:cmd - 执行的命令,callback - 进程退出后的回调(包含exitcode、执行时间等)
// 返回值:True - 执行成功,False - 执行失败

[例] let w = systemCmd('del release-notes.txt', (e)=>{log(e);})

(13)log

// 函数名:log
// 功能:标准输出流打印消息
// 参数个数:1个
// 参数类型:字符串
// 参数详解:待输出至标准流字符串

[例] log('你好 js')

(14)TimeNow

// 函数名:TimeNow
// 功能:返回一个当前时间的字符串
// 参数个数:0个
// 返回值:字符串

[例] let t = TimeNow()

(15)setShareData

// 函数名:setShareData
// 功能:存入共享数据
// 参数个数:2个
// 参数类型:字符串,数据/函数对象
// 参数详解:key - 关键字,value - 共享数据

[例] setShareData('TEXT_HELLO', '你好 js')

(16)getShareData

// 函数名:getShareData
// 功能:获取共享数据
// 参数个数:1个
// 参数类型:字符串
// 参数详解:key - 关键字
// 返回值:共享数据

[例] let t = getShareData('TEXT_HELLO')

(17)removeShareData

// 函数名:removeShareData
// 功能:删除共享数据
// 参数个数:1个
// 参数类型:字符串
// 参数详解:key - 关键字
// 返回值:旧数据

[例] let oldt = removeShareData('TEXT_HELLO')

(18)request

// 函数名:request
// 功能:发起一个远程HTTP请求
// 参数个数:4个
// 参数类型:字符串,字符串,字符串,函数对象
// 参数详解:urlpath - 远程接口路径,mode - 访问方式,params - 附加数据,func - 获取结果回调

[例] request('http://www.baidu.com', 'GET', 'name=act', function (e) { })
(注:mode可使用GET和POST两种方式)

(19)setTimeout

// 函数名:setTimeout
// 功能:延时执行一条指令
// 参数个数:2个
// 参数类型:字符串/函数,整型
// 参数详解:code - 待延时执行的指令字符串/函数对象,millisec - 延时毫秒数
[例] setTimeout('log("你好 js")', 1000)

(20)setInterval

// 函数名:setInterval
// 功能:计时器-循环执行一条指令
// 参数个数:2个
// 参数类型:字符串/函数,整型
// 参数详解:code - 循环时执行的指令字符串/函数对象,millisec - 延时毫秒数
// 返回值:开启成功将为计时器id,失败则为-1
[例] let id = setInterval('log("你好 js")', 1000)

(21)clearInterval

// 函数名:clearInterval
// 功能:延时执行一条指令
// 参数个数:1个
// 参数类型:整型
// 参数详解:id - 计时器返回的id
[例] clearInterval(id)

(22)mkdir (同dirCreate)

// 函数名:mkdir
// 功能:创建文件夹
// 参数个数:1个
// 参数类型:字符串
// 参数详解:dirname - 待创建的文件夹路径
// 返回值:True - 目录创建成功/已存在,False - 创建失败

[例] let r = mkdir('C:\\newdir')

(23)getWorkingPath

// 函数名:getWorkingPath
// 功能:获取工作目录
// 参数个数:0个
// 返回值:当前应用程序的工作目录

[例] let d = getWorkingPath()

(24)startLocalHttpListen

// 函数名:startLocalHttpListen
// 功能:开启一个本地http监听
// 参数个数:2个
// 参数类型:整型,函数
// 参数详解:port - 待监听的端口,func - HTTP监听处理函数(参数为request请求信息,回传为返回response内容文本)
// 返回值:开启成功将为监听器ID,开启失败则为-1
// (备注:仅限本地服务使用localhost或127.0.0.1访问)
[例] let h = startLocalHttpListen(8081, function(req){ return 'OK' })

(25)stopLocalHttpListen

// 函数名:stopLocalHttpListen
// 功能:关闭一个http监听
// 参数个数:1个
// 参数类型:整型
// 参数详解:id - 待关闭的http监听器ID(通过调用startLocalHttpListen获得的值)
// 返回值:是否关闭成功
[例] let r = stopLocalHttpListen(12345678)

(26)resetLocalHttpListener

// 函数名:resetLocalHttpListener
// 功能:重设一个监听器的处理函数
// 参数个数:2个
// 参数类型:整型,函数
// 参数详解:id - 待重设方法的http监听器ID,func - 新的监听处理函数
// 返回值:是否重设成功
[例] let r = resetLocalHttpListener(12345678, function(req){ return 'FAIL' })

2.MC核心玩法相关功能

(1)addBeforeActListener

// 函数名:addBeforeActListener
// 功能:注册玩家事件加载前监听器
// 参数个数:2个
// 参数类型:字符串,函数对象
// 参数详解:key - 注册用关键字,func - 供事件触发时的回调函数对象

[例] addBeforeActListener('onChat', function (e) { log(e) })

(2)removeBeforeActListener

// 函数名:removeBeforeActListener
// 功能:移除玩家事件监听器
// 参数个数:1个
// 参数类型:字符串
// 参数详解:key - 注册用关键字
// 返回值:旧的监听器

[例] let oldfunc = removeBeforeActListener('onChat')

(3)addAfterActListener

// 函数名:addAfterActListener
// 功能:注册玩家事件加载后监听器
// 参数个数:2个
// 参数类型:字符串,函数对象
// 参数详解:key - 注册用关键字,func - 供事件触发时的回调函数对象

[例] addAfterActListener('onChat', function (e) { log(e) })

(4)removeAfterActListener

// 函数名:removeAfterActListener
// 功能:移除玩家事件加载后监听器
// 参数个数:1个
// 参数类型:字符串
// 参数详解:key - 注册用关键字
// 返回值:旧监听器

[例] let oldfunc = removeAfterActListener('onChat')

(5)postTick

// 函数名:postTick
// 功能:发送一个函数至下一tick运行
// 参数个数:1个
// 参数类型:函数
// 参数详解:func - 待置入下一tick执行的函数

[例] postTick(function () { /* TODO */ })

(6)setCommandDescribe

// 函数名:setCommandDescribe
// 功能:设置一个全局指令说明
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:cmd - 命令,description - 命令说明
// 备注:延期注册的情况,可能不会改变客户端界面

[例] setCommandDescribe('testcase', '这是一个测试用例指令说明')

(7)runcmd

// 函数名:runcmd
// 功能:执行后台指令
// 参数个数:1个
// 参数类型:字符串
// 参数详解:cmd - 语法正确的MC指令
// 返回值:是否正常执行

[例] let r = runcmd('me 你好 js')

(8)logout

// 函数名:logout
// 功能:发送一条命令输出消息(可被拦截)
// 参数个数:1个
// 参数类型:字符串
// 参数详解:cmdout - 待发送的命令输出字符串

[例] logout('执行结果=正确')

(9)getOnLinePlayers

// 函数名:getOnLinePlayers
// 功能:获取在线玩家列表
// 参数个数:0个
// 返回值:玩家列表的Json字符串

[例] let v = getOnLinePlayers()

(10)getStructure

// 函数名:getStructure
// 功能:获取一个结构
// 参数个数:5个
// 参数类型:整型,字符串,字符串,布尔型,布尔型
// 参数详解:dimensionid - 地图维度,posa - 坐标JSON字符串,posb - 坐标JSON字符串,exent - 是否导出实体,exblk - 是否导出方块
// 返回值:结构json字符串

[例] let d = getStructure(0, '{"x":0, "y":4, "z":0}', '{"x":10, "y":14, "z":10}', false, true)

(11)setStructure

// 函数名:setStructure
// 功能:设置一个结构到指定位置
// 参数个数:6个
// 参数类型:字符串,整型,字符串,整型,布尔型,布尔型
// 参数详解:strnbt - 结构JSON字符串,dimensionid - 地图维度,posa - 起始点坐标JSON字符串,rot - 旋转类型,exent - 是否导入实体,exblk - 是否导入方块
// 返回值:是否设置成功

[例] let r = setStructure(fileReadAllText('data.json'), 0, '{"x":0, "y":4, "z":0}', 0, true, true)
(注:旋转类型包含4种有效旋转类型)

(12)setServerMotd

// 函数名:setServerMotd
// 功能:设置服务器的显示名信息
// 参数个数:2个
// 参数类型:字符串,布尔型
// 参数详解:motd - 新服务器显示名信息,isShow - 是否公开显示
// 返回值:是否设置成功
// (备注:服务器名称加载时机在地图完成载入之后)
[例] let r = setServerMotd('本服内容很劲爆内详', true)

(13)JSErunScript

// 函数名:JSErunScript
// 功能:使用官方脚本引擎新增一段行为包脚本并执行
// 参数个数:2个
// 参数类型:字符串,函数
// 参数详解:js - 脚本文本,cb - 执行结果回调
// (备注:每次调用都会新增脚本环境,请避免多次重复调用此方法)
[例] JSErunScript('console.log("来自行为包的日志")', (r)=>{/* 此处r表示是否执行成功 */})

(14)JSEfireCustomEvent

// 函数名:JSEfireCustomEvent
// 功能:使用官方脚本引擎发送一个自定义事件广播
// 参数个数:3个
// 参数类型:字符串,字符串,函数
// 参数详解:ename - 自定义事件名称(不能以minecraft:开头),jdata - 事件内容文本,cb - 执行结果回调
[例] JSEfireCustomEvent('mytest:testevent', '一个自定义信息', (r)=>{/* 此处r表示是否执行成功 */})

(15)getscoreById

// 函数名:getscoreById
// 功能:获取指定ID对应于计分板上的数值
// 参数个数:2个
// 参数类型:长整型,字符串
// 参数详解:id - 离线计分板的ID,objname - 计分板登记的名称(若不存在则自动添加)
// 返回值:获取的目标值,若目标不存在则返回0
[例] let s = getscoreById(1, 'money')

(16)setscoreById

// 函数名:setscoreById
// 功能:设置指定ID对应于计分板上的数值
// 参数个数:3个
// 参数类型:长整型,字符串,整型
// 参数详解:id - 离线计分板的ID,objname - 计分板登记的名称(若不存在则自动添加),count - 待设置的值
// 返回值:设置后的目标值,若未成功则返回0
[例] let s = setscoreById(1, 'money', 100)

(17)getAllScore

// 函数名:getAllScore
// 功能:获取所有计分板计分项
// 参数个数:0个
// 返回值:NBT格式的计分板json字符串
[例] let j = getAllScore()

(18)setAllScore

// 函数名:setAllScore
// 功能:设置所有计分板计分项
// 参数个数:1个
// 参数类型:字符串
// 参数详解:jdata - NBT格式的计分板json字符串
// 返回值:是否设置成功
// (备注:设置过程会清空原有数据;特定情况下可能不会立即生效)
[例] let r = setAllScore(fileReadAllText('data.json'))

(19)getMapColors

// 函数名:getMapColors
// 功能:获取一个指定位置处区块的颜色数据
// 参数个数:4个
// 参数类型:整型,整型,整型,整型
// 参数详解:x - X,y - Y,z - Z,did - 待读取的维度
// 返回值:区块位置及颜色数据内容
// (备注:如区块未处于活动状态,可能返回无效颜色数据)
[例] let r = getMapColors(0, 0, 0, 0)

(20)exportPlayersData

// 函数名:exportPlayersData
// 功能:导出地图所有离线玩家数据
// 参数个数:0个
// 返回值:玩家数据信息集
// (备注:调用时机在地图初始化完成之后生效)
[例] let d = exportPlayersData()

(21)importPlayersData

// 函数名:importPlayersData
// 功能:导入玩家数据至地图
// 参数个数:1个
// 参数类型:字符串
// 参数详解:jdata - 待导入的玩家信息集json字符串
// 返回值:是否操作成功
// (备注:设置过程会替换原有玩家数据;在线情况下可能不会生效)
[例] let r = importPlayersData(fileReadAllText('players.json'))

(22)getItemRawname

// 函数名:getItemRawname
// 功能:获取物品原始标识字符
// 参数个数:1个
// 参数类型:整型
// 参数详解:id - 物品id
// 返回值:物品原始标识字符,反查失败则返回unknown
[例] let n = getItemRawname(387)

3.MC玩家互动相关功能

(1)reNameByUuid

// 函数名:reNameByUuid
// 功能:重命名一个指定的玩家名
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,newName - 新的名称
// 返回值:是否命名成功
// (备注:该函数可能不会变更客户端实际显示名)

[例] let r = reNameByUuid('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '请叫我LiuXiaohua')

(2)getPlayerAbilities

// 函数名:getPlayerAbilities
// 功能:获取玩家能力表
// 参数个数:1个
// 参数类型:字符串
// 参数详解:uuid - 在线玩家的uuid字符串
// 返回值:能力json字符串

[例] let a = getPlayerAbilities('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9')
(注:含总计18种能力值)

(3)setPlayerAbilities

// 函数名:setPlayerAbilities
// 功能:设置玩家能力表
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,newAbilities - 新能力json数据字符串
// 返回值:是否设置成功
// (备注:该函数可能不会变更客户端实际显示能力)

[例] let r = setPlayerAbilities('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '{"opencontainers": false}')

(4)getPlayerAttributes

// 函数名:getPlayerAttributes
// 功能:获取玩家属性表
// 参数个数:1个
// 参数类型:字符串
// 参数详解:uuid - 在线玩家的uuid字符串
// 返回值:属性json字符串

[例] let t = getPlayerAttributes('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9')
(注:总计14种生物属性,含部分有效玩家属性)

(5)setPlayerTempAttributes

// 函数名:setPlayerTempAttributes
// 功能:设置玩家属性临时值表
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,newTempAttributes - 新属性临时值json数据字符串
// 返回值:是否设置成功
// (备注:该函数可能不会变更客户端实际显示值)

[例] let r = setPlayerTempAttributes('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '{"hunger": 10}')

(6)getPlayerMaxAttributes

// 函数名:getPlayerMaxAttributes
// 功能:获取玩家属性上限值表
// 参数个数:1个
// 参数类型:字符串
// 参数详解:uuid - 在线玩家的uuid字符串
// 返回值:属性上限值json字符串

[例] let m = getPlayerMaxAttributes('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9')

(7)setPlayerMaxAttributes

// 函数名:setPlayerMaxAttributes
// 功能:设置玩家属性上限值表
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,newMaxAttributes - 新属性上限值json数据字符串
// 返回值:是否设置成功
// (备注:该函数可能不会变更客户端实际显示值)

[例] let r = setPlayerMaxAttributes('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '{"maxhealth": 200}')

(8)getPlayerItems

// 函数名:getPlayerItems
// 功能:获取玩家所有物品列表
// 参数个数:1个
// 参数类型:字符串
// 参数详解:uuid - 在线玩家的uuid字符串
// 返回值:物品列表json字符串

[例] let t = getPlayerItems('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9')
(注:玩家物品包括末影箱、装备、副手和背包四项物品的nbt描述型数据列表。nbt被序列化数据类型的tag所描述,总计12种有效tag,所对应值可序列化为json数据,亦可反序列化为nbt)

(9)getPlayerSelectedItem

// 函数名:getPlayerSelectedItem
// 功能:获取玩家当前选中项信息
// 参数个数:1个
// 参数类型:字符串
// 参数详解:uuid - 在线玩家的uuid字符串
// 返回值:当前选中项信息json字符串

[例] let i = getPlayerSelectedItem('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9')
(注:选中项包含选中框所处位置,以及选中物品的nbt描述型数据)

(10)setPlayerItems

// 函数名:setPlayerItems
// 功能:设置玩家所有物品列表
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,newItems - 新物品列表json数据字符串
// 返回值:是否设置成功
// (备注:特定条件下可能不会变更游戏内实际物品)

[例] let r = setPlayerItems('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '{"Offhand":{"tt":9,"tv":[{"tt":10,"tv":[{"ck":"Count","cv":{"tt":1,"tv":1}},{"ck":"Damage","cv":{"tt":2,"tv":0}},{"ck":"Name","cv":{"tt":8,"tv":"minecraft:trident"}},{"ck":"tag","cv":{"tt":10,"tv":[{"ck":"ench","cv":{"tt":9,"tv":[{"tt":10,"tv":[{"ck":"id","cv":{"tt":2,"tv":7}},{"ck":"lvl","cv":{"tt":2,"tv":8888}}]}]}}]}}]}]}}')

(11)addPlayerItemEx

// 函数名:addPlayerItemEx
// 功能:增加玩家一个物品
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,item - 物品json数据字符串
// 返回值:是否添加成功
// (备注:特定条件下可能不会变更游戏内实际物品)

[例] let r = addPlayerItemEx('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '{"tt":10,"tv":[{"ck":"Count","cv":{"tt":1,"tv":1}},{"ck":"Damage","cv":{"tt":2,"tv":0}},{"ck":"Name","cv":{"tt":8,"tv":"minecraft:trident"}},{"ck":"tag","cv":{"tt":10,"tv":[{"ck":"ench","cv":{"tt":9,"tv":[{"tt":10,"tv":[{"ck":"id","cv":{"tt":2,"tv":10}},{"ck":"lvl","cv":{"tt":2,"tv":9999}}]}]}}]}}]}')

(12)addPlayerItem

// 函数名:addPlayerItem
// 功能:增加玩家一个物品
// 参数个数:4个
// 参数类型:字符串
// 参数详解:uuid - 在线玩家的uuid字符串,id - 物品id值,aux - 物品特殊值,count - 数量
// 返回值:是否增加成功
// (备注:特定条件下可能不会变更游戏内实际物品)

[例] let r = addPlayerItem('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', 9, 0, 32)

(13)getPlayerEffects

// 函数名:getPlayerEffects
// 功能:获取玩家所有效果列表
// 参数个数:1个
// 参数类型:字符串
// 参数详解:uuid - 在线玩家的uuid字符串
// 返回值:效果列表json字符串

[例] let e = getPlayerEffects('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9')
(注:效果为nbt描述型数据)

(14)setPlayerEffects

// 函数名:setPlayerEffects
// 功能:设置玩家所有效果列表
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,newEffects - 新效果列表json数据字符串
// 返回值:是否设置成功

[例] let r = setPlayerEffects('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '{"tt":9,"tv":[{"tt":10,"tv":[{"ck":"Ambient","cv":{"tt":1,"tv":0}},{"ck":"Amplifier","cv":{"tt":1,"tv":0}},{"ck":"DisplayOnScreenTextureAnimation","cv":{"tt":1,"tv":0}},{"ck":"Duration","cv":{"tt":3,"tv":3461}},{"ck":"DurationEasy","cv":{"tt":3,"tv":3461}},{"ck":"DurationHard","cv":{"tt":3,"tv":3461}},{"ck":"DurationNormal","cv":{"tt":3,"tv":3461}},{"ck":"Id","cv":{"tt":1,"tv":16}},{"ck":"ShowParticles","cv":{"tt":1,"tv":1}}]}]}')

(15)setPlayerBossBar

// 函数名:setPlayerBossBar
// 功能:设置玩家自定义血条
// 参数个数:3个
// 参数类型:字符串,字符串,浮点型
// 参数详解:uuid - 在线玩家的uuid字符串,title - 血条标题,percent - 血条百分比
// 返回值:是否设置成功

[例] let r = setPlayerBossBar('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '欢迎来到梦之故里', 1.00)

(16)removePlayerBossBar

// 函数名:removePlayerBossBar
// 功能:清除玩家自定义血条
// 参数个数:1个
// 参数类型:字符串
// 参数详解:uuid - 在线玩家的uuid字符串
// 返回值:是否清除成功

[例] let r = removePlayerBossBar('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9')

(17)selectPlayer

// 函数名:selectPlayer
// 功能:查询在线玩家基本信息
// 参数个数:1个
// 参数类型:字符串
// 参数详解:uuid - 在线玩家的uuid字符串
// 返回值:玩家基本信息json字符串

[例] let e = selectPlayer('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9')

(18)transferserver

// 函数名:transferserver
// 功能:传送玩家至指定服务器
// 参数个数:3个
// 参数类型:字符串,字符串,整型
// 参数详解:uuid - 在线玩家的uuid字符串,addr - 待传服务器,port - 端口
// 返回值:是否传送成功

[例] let t = transferserver('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', 'www.xiafox.com', 19132)

(19)teleport

// 函数名:teleport
// 功能:传送玩家至指定坐标和维度
// 参数个数:5个
// 参数类型:字符串,浮点型,浮点型,浮点型,整型
// 参数详解:uuid - 在线玩家的uuid字符串,X - x,Y - y,Z - z,dimensionid - 维度ID
// 返回值:是否传送成功

[例] let t = teleport('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', 10, 99, 10, 2)

(20)talkAs

// 函数名:talkAs
// 功能:模拟玩家发送一个文本
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,msg - 待模拟发送的文本
// 返回值:是否发送成功

[例] let t = talkAs('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '你好 js')

(21)runcmdAs

// 函数名:runcmdAs
// 功能:模拟玩家执行一个指令
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,cmd - 待模拟执行的指令
// 返回值:是否发送成功

[例] let t = runcmdAs('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '/me 你好 js')

(22)sendSimpleForm

// 函数名:sendSimpleForm
// 功能:向指定的玩家发送一个简单表单
// 参数个数:4个
// 参数类型:字符串,字符串,字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,title - 表单标题,content - 内容,buttons - 按钮文本数组字符串
// 返回值:创建的表单id,为 0 表示发送失败

[例] let fid = sendSimpleForm('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '致命选项', '请选择:', '["生存","死亡","求助"]')

(23)sendModalForm

// 函数名:sendModalForm
// 功能:向指定的玩家发送一个模式对话框
// 参数个数:5个
// 参数类型:字符串,字符串,字符串,字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,title - 表单标题,content - 内容,button1 按钮1标题(点击该按钮selected为true),button2 按钮2标题(点击该按钮selected为false)
// 返回值:创建的表单id,为 0 表示发送失败

[例] let fid = sendModalForm('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '没有第三个选项', '请选择:', '生存', '死亡')

(24)sendCustomForm

// 函数名:sendCustomForm
// 功能:向指定的玩家发送一个自定义表单
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,json - 自定义表单的json字符串(要使用自定义表单类型,参考nk、pm格式或minebbs专栏)
// 返回值:创建的表单id,为 0 表示发送失败

[例] let fid = sendCustomForm('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '{"content":[{"type":"label","text":"这是一个文本标签"},{"placeholder":"水印文本","default":"","type":"input","text":""},{"default":true,"type":"toggle","text":"开关~或许是吧"},{"min":0.0,"max":10.0,"step":2.0,"default":3.0,"type":"slider","text":"游标滑块!?"},{"default":1,"steps":["Step 1","Step 2","Step 3"],"type":"step_slider","text":"矩阵滑块?!"},{"default":1,"options":["Option 1","Option 2","Option 3"],"type":"dropdown","text":"如你所见,下拉框"}], "type":"custom_form","title":"这是一个自定义窗体"}')

(25)releaseForm

// 函数名:releaseForm
// 功能:放弃一个表单
// 参数个数:1个
// 参数类型:整型
// 参数详解:formid - 表单id
// 返回值:是否释放成功
//(备注:已被接收到的表单会被自动释放)

[例] let r = releaseForm(1000)

(26)setPlayerSidebar

// 函数名:setPlayerSidebar
// 功能:设置玩家自定义侧边栏临时计分板
// 参数个数:3个
// 参数类型:字符串,字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,title - 侧边栏标题,list - 列表字符串数组
// 返回值:是否设置成功
// (注:列表总是从第1行开始,总计不超过15行)
[例] let r = setPlayerSidebar('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '自定义侧边栏', '["第一行", "第二行", "我在哪行? "]')

(27)removePlayerSidebar

// 函数名:removePlayerSidebar
// 功能:清除玩家自定义侧边栏
// 参数个数:1个
// 参数类型:字符串
// 参数详解:uuid - 在线玩家的uuid字符串
// 返回值:是否清除成功
[例] let r = removePlayerSidebar('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9')

(28)getPlayerPermissionAndGametype

// 函数名:getPlayerPermissionAndGametype
// 功能:获取玩家权限与游戏模式
// 参数个数:1个
// 参数类型:字符串
// 参数详解:uuid - 在线玩家的uuid字符串
// 返回值:权限与模式的json字符串
[例] let t = getPlayerPermissionAndGametype('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9')
(注:OP命令等级包含6个有效等级[op-permission-level],权限包含3种有效权限[permissions.json],游戏模式包含5种有效模式[gamemode])

(29)setPlayerPermissionAndGametype

// 函数名:setPlayerPermissionAndGametype
// 功能:设置玩家权限与游戏模式
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,newModes - 新权限或模式json数据字符串
// 返回值:是否设置成功
// (备注:特定条件下可能不会变更游戏内实际能力)

[例] let r = setPlayerPermissionAndGametype('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '{"gametype" : 3}')

(30)disconnectClient

// 函数名:disconnectClient
// 功能:断开一个玩家的连接
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,tips - 断开提示(设空值则为默认值)
// 返回值:是否成功断开连接

[例] let r = disconnectClient('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '这个消息来自测试')

(31)sendText

// 函数名:sendText
// 功能:发送一个原始显示文本给玩家
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,msg - 文本内容,空白内容则不予发送
// 返回值:是否发送成功

[例] let r = sendText('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', '这个文本来自测试')

(32)getscoreboard

// 函数名:getscoreboard
// 功能:获取指定玩家指定计分板上的数值
// 参数个数:2个
// 参数类型:字符串,字符串
// 参数详解:uuid - 在线玩家的uuid字符串,objname - 计分板登记的名称
// 返回值:获取的目标值,若目标不存在则返回0

[例] let m = getscoreboard('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', 'money')

(33)setscoreboard

// 函数名:setscoreboard
// 功能:设置指定玩家指定计分板上的数值
// 参数个数:3个
// 参数类型:字符串,字符串,整型
// 参数详解:uuid - 在线玩家的uuid字符串,objname - 计分板登记的名称,count - 待设定的目标值
// 返回值:是否设置成功
// (备注:特定条件下可能不会变更游戏内实际能力)

[例] let t = setscoreboard('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9', 'money', 3)

(34)getPlayerIP

// 函数名:getPlayerIP
// 功能:获取玩家IP
// 参数个数:1个
// 参数类型:字符串
// 参数详解:uuid - 在线玩家的uuid字符串
// 返回值:玩家IP

[例] let i = getPlayerIP('8f976e22-78bc-3fe1-8ee5-cf5ff56347b9')

三、注册机制

   本JS插件运行平台采用事件驱动机制与游戏进行内容交互。注册监听关键字,通过特定事件被触发后的回传结果,进行判断、执行额外指令来实现插件功能。所有事件同BDSNetRunner。

1.注册范例

[例] addBeforeActListener(key, function (e) { })

key - 关键字
 "onUseItem" - 使用物品回调
e - 回传数据
 playername - 玩家名字
 dimension - 玩家所在维度
 dimensionid - 玩家所在维度ID
 isstand - 玩家是否立足于方块/悬空
 XYZ - 玩家所处位置
 position - 操作方块所在位置
 itemid - 物品ID
 itemaux - 物品特殊值
 itemname - 物品名称
 RESULT - 原事件操作是否成功(仅限After事件)

其中,对于注册Before事件的函数返回值(true/false)决定了是否拦截该事件(非全部)。其它关键字类推。

2.所有事件

(1)"onServerCmd" - 后台指令监听

拦截可否:是
回传数据:
cmd – 指令数据

(2)"onServerCmdOutput" - 后台指令输出信息监听

拦截可否:是
回传数据:
output – 输出信息

(3)"onFormSelect" - 玩家选择GUI表单监听

拦截可否:是
回传数据:
uuid – 玩家uuid信息
formid – 表单ID
selected – 表单回传的选择项信息
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(4)"onUseItem" - 使用物品监听

拦截可否:是
回传数据:
position – 操作方块所在位置
itemid – 物品ID
itemaux – 物品特殊值
itemname – 物品名称
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置
(注:使用物品事件可在单次点击内触发多次,需自行处理事件合并)

(5)"onPlacedBlock" - 放置方块监听

拦截可否:是
回传数据:
position – 操作方块所在位置
blockid – 方块ID
blockname – 方块名称
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(6)"onDestroyBlock" - 破坏方块监听

拦截可否:是
回传数据:
position – 操作方块所在位置
blockid – 方块ID
blockname – 方块名称
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(7)"onStartOpenChest" - 开箱监听

拦截可否:是
回传数据:
position – 操作方块所在位置
blockid – 方块ID
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(8)"onStartOpenBarrel" - 开桶监听

拦截可否:否
回传数据:
position – 操作方块所在位置
blockid – 方块ID
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(9)"onStopOpenChest" - 关箱监听

拦截可否:否
回传数据:
position – 操作方块所在位置
blockid – 方块ID
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(10)"onStopOpenBarrel" - 关桶监听

拦截可否:否
回传数据:
position – 操作方块所在位置
blockid – 方块ID
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(11)"onSetSlot" - 放入取出物品监听

拦截可否:否
回传数据:
itemid – 物品ID
itemcount – 物品数量
itemname – 物品名字
itemaux – 物品特殊值
position – 操作方块所在位置
blockid – 方块ID
blockname – 方块名称
slot – 操作格子位置
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(12)"onChangeDimension" - 切换维度监听

拦截可否:否
回传数据:
position – 玩家所处位置
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(13)"onMobDie" - 生物死亡监听

拦截可否:否
回传数据:
mobname – 生物名称
dimensionid – 生物所处维度ID
XYZ – 生物所在位置
mobtype – 生物类型
srcname – 伤害源名称
srctype – 伤害源类型
dmcase – 伤害具体原因ID
playername – 玩家名字(若为玩家死亡,附加此信息)
dimension – 玩家所在维度(附加信息)
isstand – 玩家是否立足于方块/悬空(附加信息)

(14)"onMobHurt" - 生物受伤监听

拦截可否:是
回传数据:
health – 生物血量
dmtype – 生物受伤类型
dmcount – 生物受伤具体值
mobname – 生物名称
dimensionid – 生物所处维度ID
XYZ – 生物所在位置
mobtype – 生物类型
srcname – 伤害源名称
srctype – 伤害源类型
dmcase – 伤害具体原因ID
playername – 玩家名字(若为玩家受伤,附加此信息)
dimension – 玩家所在维度(附加信息)
isstand – 玩家是否立足于方块/悬空(附加信息)

(15)"onRespawn" - 玩家重生监听

拦截可否:否
回传数据:
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(16)"onChat" - 聊天监听

拦截可否:否
回传数据:
playername – 发言人名字(可能为服务器或命令方块发言)
target – 接收者名字
msg – 接收到的信息
chatstyle – 聊天类型

(17)"onInputText" - 玩家输入文本监听

拦截可否:是
回传数据:
msg – 输入的文本
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(18)"onCommandBlockUpdate" - 玩家更新命令方块监听

拦截可否:是
回传数据:
position – 命令方块所在位置
cmd – 将被更新的新指令
isblock – 是否是方块
actortype – 实体类型(若被更新的是非方块,附加此信息)
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(19)"onInputCommand" - 玩家输入指令监听

拦截可否:是
回传数据:
cmd – 玩家输入的指令
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(20)"onBlockCmd" - 命令方块(矿车)执行指令监听

拦截可否:是
回传数据:
cmd – 将被执行的指令
tickdelay – 命令设定的间隔时间
type – 执行者类型
name – 执行者自定义名称
position – 执行者所在位置

(21)"onNpcCmd" - NPC执行指令监听

拦截可否:是
回传数据:
position – NPC所在位置
entity – NPC实体标识名
entityid – NPC实体标识ID
npcname – NPC名字
dimensionid – NPC所处维度ID
dimension – NPC所处维度
actionid – 选择项
actions – 指令列表

(22)"onLoadName" - 加载名字监听

拦截可否:否
回传数据:
playername – 玩家名字
uuid – 玩家uuid字符串
xuid – 玩家xuid字符串
ability – 玩家能力值列表

(23)"onPlayerLeft" - 离开游戏监听

拦截可否:是
回传数据:
playername – 玩家名字
uuid – 玩家uuid字符串
xuid – 玩家xuid字符串
ability – 玩家能力值列表

(24)"onMove" - 移动监听

拦截可否:否
回传数据:
position – 玩家所处位置
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(25)"onAttack" - 攻击监听

拦截可否:是
回传数据:
dmcase – 伤害类型
actorname – 被攻击实体名称
actortype – 被攻击实体类型
position – 玩家所处位置
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(26)"onLevelExplode" - 爆炸监听

拦截可否:是
回传数据:
position – 爆炸点所在位置
entity – 爆炸者实体标识名
entityid – 爆炸者实体标识ID
dimensionid – 爆炸者所处维度ID
dimension – 爆炸者所处维度
explodepower – 爆炸强度

(27)"onEquippedArmor" - 玩家切换护甲监听(含主副手)

拦截可否:否
回传数据:
itemname – 物品名字
itemcount – 物品数量
slot – 操作格子位置
itemaux – 物品特殊值
itemid – 物品ID
slottype – 装备切换类型(0 - 护甲类,1 - 主副手类,其中主副手的格子位置不同)
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(28)"onLevelUp" - 玩家升级监听

拦截可否:是
回传数据:
lv – 等级
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(29)"onPistonPush" - 活塞推方块监听

拦截可否:是
回传数据:
direction – 朝向
dimension – 方块所在维度
dimensionid – 方块所处维度ID
blockname – 方块名称
position – 方块所在位置
blockid – 方块ID
targetposition – 目标方块所在位置
targetblockid – 目标方块ID
targetblockname – 目标方块名称

(30)"onChestPair" - 箱子合并事件

拦截可否:是
回传数据:
dimension – 方块所在维度
dimensionid – 方块所处维度ID
blockname – 方块名称
position – 方块所在位置
blockid – 方块ID
targetposition – 目标方块所在位置
targetblockid – 目标方块ID
targetblockname – 目标方块名称

(31)"onMobSpawnCheck" - 生物生成检查监听

拦截可否:是
回传数据:
mobname – 生物名称
dimension – 生物所在维度
mobtype – 生物类型
XYZ – 生物所在位置
dimensionid – 生物所处维度ID

(32)"onDropItem" - 玩家丢物品监听

拦截可否:是
回传数据:
itemname – 物品名称
itemid – 物品ID
itemaux – 物品特殊值
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(33)"onPickUpItem" - 玩家拾取物品监听

拦截可否:是
回传数据:
itemname – 物品名称
itemid – 物品ID
itemaux – 物品特殊值
playername – 玩家名字
dimensionid – 玩家所在维度ID
dimension – 玩家所在维度
isstand – 玩家是否立足于方块/悬空
XYZ – 玩家所处位置

(34)"onScoreChanged" - 计分板分数改变监听

拦截可否:否
回传数据:
objectivename – 计分板名称
displayname – 计分板显示名
scoreboardid – 计分板ID值
score – 分数

(35)"onScriptEngineInit" - 官方脚本引擎初始化监听

拦截可否:否
回传数据:
jseptr – 引擎指针

(36)"onScriptEngineLog" - 官方脚本接收日志监听

拦截可否:是
回传数据:
jseptr – 引擎指针
log – 官方脚本引擎输出信息(当脚本引擎开启日志功能时可捕获此内容)

(37)"onScriptEngineCmd" - 官方脚本引擎执行指令监听

拦截可否:是
回传数据:
jseptr – 引擎指针
cmd – 将被执行的指令

(38)"onScoreboardInit" - 系统计分板初始化监听

拦截可否:否
回传数据:
scptr – 系统计分板指针


四、杂项

本版JSR无隐藏种子功能,相关功能可参考CSR系列插件。
关于商业版:
涉及的api包含:(
getStructure,
setStructure,
getPlayerAbilities,
setPlayerAbilities,
getPlayerAttributes,
setPlayerTempAttributes,
getPlayerMaxAttributes,
setPlayerMaxAttributes,
getPlayerItems,
setPlayerItems,
getPlayerSelectedItem,
addPlayerItemEx,
getPlayerEffects,
setPlayerEffects,
setPlayerBossBar,
removePlayerBossBar,
transferserver,
teleport,
setPlayerSidebar,
removePlayerSidebar,
getPlayerPermissionAndGametype,
setPlayerPermissionAndGametype,
getAllScore,
setAllScore,
getMapColors,
exportPlayersData,
importPlayersData

涉及的事件监听包含:(
onMobHurt,
onBlockCmd,
onNpcCmd,
onCommandBlockUpdate

Writting for BDSNetRunner, All Rights Reserved.
2020-2023