Skip to content

JavaScript 脚本基础

本文档介绍 QueDP JavaScript 脚本的核心概念和语法。

1. 选择器 (Selectors)

选择器用于指定动作的目标玩家。

选择器英文别名说明
@所有玩家@all, @a地牢中的所有玩家
@触发者@trigger, @p触发当前事件的玩家
@队伍@party触发者的队伍成员
@随机@random随机选择一个玩家
@最近@nearest距离触发位置最近的玩家

使用示例:

javascript
action.message('@所有玩家', '大家好');
action.heal('@触发者');
action.give_item('@随机', 'diamond', 1);

2. 变量系统

QueDP 提供了灵活的变量系统,用于存储和传递数据。

内置对象

对象说明访问方式
player触发者玩家对象 (Bukkit Player)player.getName()
trigger同 playertrigger.getName()
dungeon地牢实例对象dungeon.getPlayers()

IMPORTANT

QueDP 使用 GraalJS 引擎,访问 Java 对象需要使用方法调用而不是属性访问:

  • 正确: player.getName()
  • 错误: player.name (会返回函数引用)

常用 Player 方法:

javascript
player.getName()        // 获取玩家名
player.getHealth()      // 获取当前血量
player.getMaxHealth()   // 获取最大血量
player.getLocation()    // 获取位置
player.getWorld()       // 获取世界
player.getLevel()       // 获取等级
player.getGameMode()    // 获取游戏模式

自定义变量 (读写)

使用 setVargetVar 在整个地牢实例中共享数据。

javascript
// 设置变量
setVar('总击杀', 0);
setVar('BossDead', true);

// 读取变量 (建议提供默认值)
var kills = getVar('总击杀') || 0;

// 变量运算
setVar('总击杀', kills + 1);

TIP

变量在整个地牢实例的生命周期内有效,可以在不同的脚本文件(如 monsters.ymltasks.yml)之间共享。

WARNING

使用 action.wait() 时,wait 之后的代码会在新的上下文中执行,局部变量不会保留。 需要跨 wait 使用的数据请用 setVar/getVar 保存。

3. 等待与延迟

使用 action.wait() 可以暂停脚本执行:

javascript
action.message('@all', '3秒后开始...')
action.wait('3秒')
action.message('@all', '开始!')

支持的时间格式:

  • '5秒''5s' - 秒
  • '100tick''100t' - tick (1秒=20tick)
  • '2分钟''2min' - 分钟

IMPORTANT

action.wait() 后面的代码会在延迟后的新上下文中执行,局部变量会丢失。 如果需要在 wait 前后传递数据,请使用 setVar/getVar

javascript
var playerName = player.getName()
setVar('_playerName', playerName)  // 保存到持久变量

action.wait('5秒')

var name = getVar('_playerName')   // 从持久变量读取
action.message('@all', name + ' 完成了任务')

4. 随机数生成

使用 JavaScript Math

javascript
// 随机整数 0-99
var rand = Math.floor(Math.random() * 100);

// 50% 概率
if (Math.random() < 0.5) {
    action.message('@all', '运气不错!');
}

使用占位符 (推荐)

在字符串参数中,可以直接使用 {random:...} 占位符:

  • 范围随机: {random:1-100}
  • 列表随机: {random:金,木,水,火,土}
javascript
action.message('@all', '本次幸运数字: {random:1-100}');

随机怪物函数

  • action.random_monster_group('组A', '组B'): 从多个组中随机选一个ID返回
  • action.random_spawn_group('组A', '组B'): 从多个组中随机选一个并立即生成

5. 常用语法速查

QueDP 使用 GraalJS 引擎,支持 ES6+ 语法。

条件判断

javascript
var score = getVar('分数') || 0;

if (score >= 100) {
    action.reward('大奖');
} else if (score >= 60) {
    action.reward('小奖');
} else {
    action.message('@p', '继续努力');
}

循环

javascript
// for 循环 - 支持 action.wait
for (var i = 5; i > 0; i--) {
    action.title('@all', '&c' + i, '')
    action.sound('@all', 'BLOCK_NOTE_BLOCK_PLING', 1.0, 1.0)
    action.wait('1秒')
}
action.message('@all', '开始!')

// while 循环 - 变量修改必须放在 wait 之前
setVar('_count', 3)
while (getVar('_count') > 0) {
    action.message('@all', '倒计时: ' + getVar('_count'))
    setVar('_count', getVar('_count') - 1)  // 必须在 wait 之前
    action.wait('1秒')
}

TIP

循环内的 action.wait() 会自动转换为递归调用,无需手动处理。

WARNING

while 循环注意事项:

  • 循环变量必须使用 setVar/getVar 存储(局部变量在 wait 后会丢失)
  • 变量修改代码必须放在 action.wait() 之前
  • action.wait() 后面的代码会被截断,不会执行

调试技巧

javascript
// 输出到服务器控制台
log('当前分数: ' + getVar('分数'));

// 输出给玩家
action.message('@p', '调试信息: ' + someVar);

6. 注释

GraalJS 支持标准 JavaScript 注释:

javascript
// 单行注释

/* 
   多行注释
   可以跨越多行
*/

基于 MIT 许可发布