跳转至

副本检测命令

本页包含与副本(Instance)相关的检测命令。


副本状态检测

CheckInstance (检测副本存在)

检测玩家是否拥有指定地图的副本实例。

语法格式:

#IF
CheckInstance 地图编号

参数说明:

参数 类型 说明
地图编号 int 副本对应的地图ID

示例:

#IF
CheckInstance 80
#ACT
; 玩家拥有屠魔大厅副本
InstanceMove 80 0 0 3
#ELSEACT
; 玩家没有副本,需要先创建
Goto @创建副本

CheckInInstance (检测在副本中)

检测玩家当前是否在副本地图中。

语法格式:

#IF
CheckInInstance

示例:

#IF
CheckInInstance
#ACT
Break
#SAY
您当前在副本中,无法使用此功能!

副本节点检测

CheckInstanceNode (检测副本节点)

检测当前副本地图的节点值是否满足指定条件。

语法格式:

#IF
CheckInstanceNode 操作符 节点值

参数说明:

参数 类型 说明
操作符 string <, <=, >, >=, ==, !=
节点值 int 要比较的节点值

检查逻辑:

  1. 获取玩家当前对话守卫所在地图或玩家当前地图的副本节点值
  2. 将节点值与目标值进行比较
  3. 返回比较结果

示例:

; 检测副本节点是否小于20(还在第一层)
#IF
CheckInstanceNode < 20
#ACT
InstanceMove 227 881 295 0
ChangeCurrentInstanceNode 20
ChangeTime 5
Break

; 检测副本节点是否已完成最后一层
#IF
CheckInstanceNode >= 90
#ACT
MOV J9 10
MOVE 147 0 0 1
Break

CheckInstanceVar (检测副本变量)

检测副本实例的数字变量值。

语法格式:

#IF
CheckInstanceVar 变量索引 比较符 值

参数说明:

参数 类型 说明
变量索引 int 副本变量的索引号
比较符 string =, >, <, >=, <=
int 要比较的值

示例:

#IF
CheckInstanceVar 0 == 1
#ACT
; 副本变量[0]等于1
Break
#SAY
BOSS已被击杀!

队伍检测命令

Groupleader (检测是否队长)

检测玩家是否为队长。

语法格式:

#IF
Groupleader

逻辑说明:

  • 玩家是队长 → 条件为真
  • 玩家不是队长或没有队伍 → 条件为假

等价写法

GroupLeader / Groupleader / 检测队长 均可(命令大小写不敏感)。

示例:

#IF
not Groupleader
#ACT
Break
#SAY
勇士你不是队长,请等待队长操作!

CheckHasGroup (检测是否有队伍)

检测玩家是否有队伍。

语法格式:

#IF
CheckHasGroup

示例:

#IF
not CheckHasGroup
#ACT
Break
#SAY
您需要组队才能进入此副本!

GroupCount (检测队伍人数)

检测队伍人数是否满足条件。

语法格式:

#IF
GroupCount 操作符 数量

示例:

#IF
GroupCount > 3
#ACT
Break
#SAY
队伍人数超过3人!

替代方案

也可以使用 CheckCalc <$GROUPNUM> > 3 来检测队伍人数。


GroupCheckNearby (检测队友附近)

检测队伍成员是否都在当前对话 NPC 附近(9格范围内)。

语法格式:

#IF
GroupCheckNearby

检查逻辑:

  1. 获取 NPC 坐标(以对话守卫为中心)
  2. 遍历队伍成员
  3. 检查每个成员是否在 NPC 附近 9 格内
  4. 检查每个成员是否在同一地图
  5. 离线成员会导致检测失败
  6. 无队伍或找不到 NPC 时,直接判定失败

示例:

#IF
GroupCheckNearby
#ACT
CreateInstance 80 20 0 0 0
GroupInstanceMove 80 0 0 3
GroupGoto @扣除金币
Break
#ELSESAY
队伍成员不在附近

CheckGroupVar (检测队伍变量)

检测队伍所有成员的变量是否满足条件。

语法格式:

#IF
CheckGroupVar 变量类型 比较符 值

支持的变量类型:

变量类型 说明 示例
$LEVEL 等级 CheckGroupVar $LEVEL < 25
$GOLD 金币 CheckGroupVar $GOLD < 100000
$ItemNum(物品ID,数量) 物品数量检测 CheckGroupVar $ItemNum(90226,3) == 0
J变量号 J变量值 CheckGroupVar J24 < 1
U变量号 U变量值 CheckGroupVar U1 < 1
G变量号 G变量值 CheckGroupVar G1 < 1

$ItemNum 说明

$ItemNum(物品ID,数量) 返回 1(有该物品)或 0(没有)。

  • CheckGroupVar $ItemNum(90226,3) == 0 = 检测是否有队员没有3个物品90226
  • 如果有人没有,条件满足,执行阻止逻辑

注意事项

  • J/U/G 变量不要加 % 前缀,代码内部会自动添加
  • <$GOLD> 写法无效,会被提前替换成数值导致解析失败
  • 变量解析失败会视为条件不成立

执行逻辑:

foreach (队员 in 队伍成员)
{
    if (队员不满足条件)
    {
        return false;  // 立即退出,不再检查后面的队员
    }
}
return true;  // 所有队员都满足条件

核心语义:检查所有队员是否都满足条件,遇到第一个不满足的就退出。


为什么需要 not

当需求是"检测是否有人满足某条件"时,必须使用 not + 反向条件。

示例需求:检测队伍中是否有人已进入过副本(J24 >= 1)

写法 实际语义 队长J24=0, 队友J24=3 时
CheckGroupVar J24 > 0 所有人 J24 > 0 ❌ 队长不满足就退出,漏检队友
not CheckGroupVar J24 < 1 有人 J24 >= 1 ✅ 正确检测到队友

逻辑解释

  1. CheckGroupVar J24 < 1 = 检查"所有人 J24 < 1"(没人进入过)
  2. 如果有人 J24 >= 1,条件返回 false
  3. not false = true,触发阻止逻辑

错误写法分析

; ❌ 错误:只检查到第一个不满足的队员就退出
#IF
CheckGroupVar J24 > 0
#ACT
Break
#SAY
队伍中有人今天已经去过该副本了。

执行流程(队长J24=0, 队友J24=3):

  1. 检查队长:0 > 0 = false → 立即退出
  2. 队友根本没被检查 → 条件不满足 → 不执行 Break
  3. 结果:有人进入过但没被阻止!

正确写法

; ✅ 正确:检测是否有人 J24 >= 1
#IF
not CheckGroupVar J24 < 1
#ACT
Break
#SAY
队伍中有人今天已经去过该副本了。

执行流程(队长J24=0, 队友J24=3):

  1. 检查队长:0 < 1 = true → 继续
  2. 检查队友:3 < 1 = false → 退出,返回 false
  3. not false = true → 执行 Break
  4. 结果:正确阻止!

常用场景写法

; 检测队伍所有成员等级 >= 25(有人不足则阻止)
#IF
not CheckGroupVar $LEVEL >= 25
#ACT
Break
#SAY
队伍有成员等级未达到25级!

; 检测是否有人今日已进入副本(有人进入过则阻止)
#IF
not CheckGroupVar J24 < 1
#ACT
Break
#SAY
队伍中有人今天已经去过该副本了。

; 检测队伍金币(推荐使用专用命令)
#IF
not CheckGroupMemberGold >= 50000
#ACT
Break
#SAY
队伍有成员金币不到5万!

CheckGroupVarAny (检测队伍变量-有人满足)

检测队伍中是否有人满足条件。这是 CheckGroupVar 的简化版本,无需使用 not 反向逻辑。

语法格式:

#IF
CheckGroupVarAny 变量名 比较符 值

语义对比:

命令 语义
CheckGroupVar J24 < 1 所有人 J24 < 1
CheckGroupVarAny J24 >= 1 有人 J24 >= 1

解析规则

  • 队伍不存在 → 条件不成立
  • 单个成员变量解析失败 → 跳过该成员继续检查
  • 若所有成员都不满足(或全部解析失败)→ 条件不成立

示例:

; ✅ 直观写法:检测是否有人今日已进入副本
#IF
CheckGroupVarAny J24 >= 1
#ACT
Break
#SAY
队伍中有人今天已经去过该副本了。

; 等价于旧写法
#IF
not CheckGroupVar J24 < 1

推荐用法:

需求 推荐命令
有人满足条件 CheckGroupVarAny
所有人满足条件 CheckGroupVar

CheckGroupVarEx (检测队伍变量扩展)

检测队伍变量的扩展版本,支持附加条件过滤成员。

命令速览:

命令 作用 格式
CheckGroupVarEx 检测队伍变量扩展 CheckGroupVarEx 主变量 [操作符] [主值] 附加变量 [操作符] [附加值]

语法格式:

#IF
CheckGroupVarEx 主变量 主比较符 主值 附加变量 附加比较符 附加值

通俗解释:

先用“附加条件”筛选队员,再在被筛选出来的队员里检查主条件。
只要有一个队员同时满足“附加条件 + 主条件”,就算成立。

参数说明:

参数 说明 示例
主变量 要检测的主要变量 $GOLD / $LEVEL / $ItemNum(90226,3) / J24
主比较符 比较操作符 == != > < >= <=
主值 主变量的比较目标 100000 / 0 / 25
附加变量 用于筛选成员的变量 J47 / U10 / G2
附加比较符 比较操作符 == != > < >= <=
附加值 附加变量的比较目标 0 / 1

执行逻辑(对应源码):

  1. 逐个遍历队伍成员
  2. 先判断“附加条件”,不满足则跳过该成员
  3. 只有满足附加条件的成员才检查主条件
  4. 只要有成员同时满足“附加条件 + 主条件” → 条件成立
  5. 队伍不存在或变量解析失败 → 条件不成立
  6. 没有任何成员满足附加条件 → 条件不成立

好处:

  • 可以把“过滤人群”与“检测条件”拆开,逻辑更清晰
  • 常用于:只检查“未扣费/未标记”的队员,避免重复扣除或重复校验
  • 解决“某些队员已被豁免”的场景(比如 J47=1 的成员不参与检测)

变量解析失败

任一成员的变量无法解析为数字时,整条检测会失败(条件不成立)。

示例 1:排除标记成员,检查金币不足

; 检测队伍金币,排除 J47 == 1 的成员
#IF
CheckGroupVarEx $GOLD < 100000 J47 == 0
#ACT
Break
#SAY
队伍有成员金币不到10万!

示例 2:排除标记成员,检查入场券不足

; 检测队伍入场券不足,排除 J47 == 1 的成员
#IF
CheckGroupVarEx $ItemNum(90226,3) == 0 J47 == 0
#ACT
Break
#SAY
队伍有成员灵符不到3个!

示例 3:配合 GroupGoto 的“标记免检”流程

; 先筛选没被标记的队员,再检查金币
#IF
CheckGroupVarEx $GOLD < 100000 J47 == 0
#ACT
Break
#SAY
队伍有成员金币不足!

; 扣费后统一标记(让后续检测跳过)
[@扣金币]
#IF
#ACT
MOV J47 1
TakeGold 100000

CheckGroupMemberLevel (检测队员等级)

检测队伍成员等级。

语法格式:

#IF
CheckGroupMemberLevel 操作符 等级

CheckGroupMemberGold (检测队员金币)

检测队伍所有成员金币是否满足条件。

语法格式:

#IF
CheckGroupMemberGold 操作符 金额

执行逻辑:

  • 队伍不存在或参数解析失败 → 条件不成立
  • 需要所有队员都满足比较条件才成立(与 CheckGroupVar 一致)

示例:

; 队伍有人金币不足则阻止
#IF
not CheckGroupMemberGold >= 50000
#ACT
Break
#SAY
队伍有成员金币不到5万!

CheckGroupMemberItem (检测队员物品)

检测队伍成员是否拥有指定物品。

语法格式:

#IF
CheckGroupMemberItem 物品名 数量

CheckGroupMemberItemIdx (检测队员物品-按编号)

检测队伍成员是否拥有指定编号的物品。

语法格式:

#IF
CheckGroupMemberItemIdx 物品ID 数量

完整示例

副本入口检测流程

[@进入副本]
; 检测是否队长
#IF
not Groupleader
#ACT
Break
#SAY
勇士你不是队长,请等待队长操作!

; 检测队伍人数
#IF
CheckCalc <$GROUPNUM> > 3
#ACT
Break
#SAY
队伍人数超过3人!

; 检测队伍等级(有人不足则阻止)
#IF
not CheckGroupVar $LEVEL >= 25
#ACT
Break
#SAY
队伍有成员等级未达到25级!

; 检测今日进入次数
#IF
CHECKGROUPVAR J255 == 1
#ACT
Break
#SAY
队伍中有人今天已经去过该副本了。

; 检测队伍金币
#IF
not CheckGroupMemberGold >= 50000
#ACT
Break
#SAY
队伍有成员金币不到5万!

; 检测队友是否在附近
#IF
GroupCheckNearby
#ACT
CreateInstance 72 180 1 0 0
GroupInstanceMove 72 0 0 3
GroupGoto @扣除道具
Break
#ELSESAY
队伍成员不在附近

[@扣除道具]
#IF
#ACT
MOV J255 1
TAKEITEM 副本入场券 1

九层妖塔节点检测

[@MAIN]
#IF
#ACT
REMOVEBUFF 58001
REMOVEBUFF 58011

; 检查是否已完成妖塔
#IF
CHECKCALC <$STR(J9)> >= 10
#ACT
MOV J0 1
MOVE 147 0 0 1
Break

; 进入第一层(节点0-19)
#IF
CHECKINSTANCENODE < 20
#ACT
INSTANCEMOVE 227 881 295 0
CHANGECURRENTINSTANCENODE 20
CHANGETIME 5
Break

; 进入第二层(节点20-29)
#IF
CHECKINSTANCENODE < 30
#ACT
INSTANCEMOVE 227 733 443 0
CHANGECURRENTINSTANCENODE 30
CHANGETIME 5
Break

; 完成最后一层
#IF
CHECKINSTANCENODE >= 90
#ACT
MOV J9 10
MOV J0 1
MOV A0 完成妖塔
MOVE 147 0 0 1
Break

相关操作命令

  • CreateInstance - 创建副本实例
  • InstanceMove - 单人副本传送
  • GroupInstanceMove - 组队副本传送
  • ChangeInstanceNode - 修改指定副本节点
  • ChangeCurrentInstanceNode - 修改当前副本节点
  • ChangeTime - 修改副本计时
  • GroupGoto - 队伍跳转标签

详见 副本系统命令 - 副本相关命令速查表