Skip to content

选择器

选择器用于定位 Minecraft 世界中的实体。RedScript 使用与原版 Minecraft 相同的选择器语法,完全集成到类型系统中。

基础选择器

选择器目标
@a所有玩家
@e所有实体
@p最近的玩家
@s执行者(自身)
@r随机玩家
rs
say_to(@a, "Hello everyone!");
say_to(@p, "Hello nearest player!");
kill(@e[type=zombie]);

选择器参数

在方括号中使用参数过滤目标:

rs
// 按标签
effect(@a[tag=vip], "glowing", 10, 1);

// 按类型
kill(@e[type=zombie]);

// 按距离
give(@a[distance=..10], "diamond", 1);

// 按游戏模式
tp(@a[gamemode=survival], 0, 100, 0);

// 按名称
tp(@a[name=Alex], 0, 100, 0);

多个参数

使用逗号组合参数:

rs
// 10 格内带有 "playing" 标签的生存模式玩家
effect(@a[gamemode=survival, distance=..10, tag=playing], "speed", 5, 1);

// 20 格内的所有僵尸
kill(@e[type=zombie, distance=..20]);

距离范围

rs
@a[distance=..10]      // 10 格以内
@a[distance=5..]       // 5 格以外
@a[distance=5..10]     // 5 到 10 格之间

基于分数的选择

通过记分板值选择:

rs
// 击杀数 >= 10 的玩家
give(@a[scores={kills=10..}], "gold_ingot", 1);

// 生命值在 1 到 5 之间的玩家
effect(@a[scores={health=1..5}], "regeneration", 5, 2);

限制与排序

rs
// 按分数排序的前 3 名玩家
@a[sort=arbitrary, limit=3]

// 最近的 5 个实体
@e[sort=nearest, limit=5]

// 随机玩家
@a[sort=random, limit=1]

视角过滤器

检测玩家看向的方向:

rs
// 抬头看 (俯仰角 < -45)
foreach (p in @a[x_rotation=-90..-45]) {
    say("在看天空!");
}

// 低头看 (俯仰角 > 45)
foreach (p in @a[x_rotation=45..90]) {
    say("在看地面!");
}

// 面向北方 (偏航角约 180)
foreach (p in @a[y_rotation=135..225]) {
    say("面向北方!");
}

位置过滤器

按坐标选择:

rs
// 在特定区域内的玩家
foreach (p in @a[x=-10..10, y=60..70, z=-10..10]) {
    effect(@s, "glowing", 1, 0);
}

变量选择器语法 v1.1.0

foreach 循环内,可以对循环变量使用过滤器:

rs
foreach (p in @a) {
    // p[filters] 自动转换为 @s[filters]
    execute if entity p[x_rotation=-90..-45] run {
        tag_add(@s, "looking_up");
    }
    execute unless entity p[x_rotation=-90..-45] run {
        tag_remove(@s, "looking_up");
    }
}

这是语法糖 —— p[x_rotation=-90..-45] 编译为 @s[x_rotation=-90..-45]

命名空间语法

使用 #mc_name 作为 Minecraft 命名空间 ID 的简写:

rs
// 以下两种写法等价:
kill(@e[type=#mc_zombie]);
kill(@e[type=minecraft:zombie]);

// 适用于任何命名空间引用
give(@a, #mc_diamond_sword, 1);

选择器作为参数

将选择器传递给函数:

rs
fn buff(targets: selector) {
    effect(targets, "strength", 30, 1);
    effect(targets, "speed", 30, 1);
    effect(targets, "resistance", 30, 1);
}

buff(@a[tag=team_red]);
buff(@a[tag=team_blue]);

实际示例

基于选择器的竞技场小游戏逻辑:

rs
let arena_center_x: int = 0;
let arena_center_z: int = 0;

@tick(rate=20)
fn arena_check() {
    // 治疗竞技场内的玩家
    effect(@a[tag=playing, distance=..50], "regeneration", 2, 0);

    // 伤害竞技场外的玩家
    effect(@a[tag=playing, distance=50..], "wither", 2, 0);

    // 移除死亡的怪物
    kill(@e[type=zombie, nbt={Health:0f}]);
}

下一步

Released under the MIT License.