361引擎的 NPC 对话框本身没有独立的“动态按钮”专属命令,动态按钮通常通过脚本变量控制按钮显示内容、跳转目标和可见性来实现。任务脚本里常用的做法是:用变量记录任务进度,再用 #IF 判断,在对话框里输出不同按钮;或者通过 GOTO 跳转到不同段落,使按钮随任务状态变化。
一、用变量控制按钮显示
任务脚本最基础的做法是使用变量记录任务状态。变量可以用 P0-P9、D0-D9 或逻辑变量 [N]。
示例:
[@main]
IF
EQUAL <TASK_STATE> 0
ACT
GOTO @未接任务
IF
EQUAL <TASK_STATE> 1
ACT
GOTO @任务进行中
IF
EQUAL <TASK_STATE> 2
ACT
GOTO @任务已完成
[@未接任务]
SAY
我是新手引导员,需要帮助吗?\
<接取任务/@接取>\
<离开/@exit>
[@接取]
IF
ACT
MOV <TASK_STATE> 1
GIVE 任务道具 1
GOTO @任务进行中
[@任务进行中]
IF
CHECKITEM 任务道具 1
ACT
GOTO @任务未完成
IF
ACT
GOTO @任务可提交
[@任务未完成]
SAY
你还没有完成任务,继续去收集材料吧。\
<继续任务/@exit>
[@任务可提交]
SAY
任务材料已经收集完成。\
<提交任务/@提交>\
<离开/@exit>
[@提交]
IF
CHECKITEM 任务道具 1
ACT
TAKE 任务道具 1
MOV <TASK_STATE> 2
GIVE 任务奖励 1
GOTO @任务已完成
[@任务已完成]
SAY
你已经完成该任务。\
<离开/@exit>
这里按钮本身没有隐藏,但按钮显示的文字和跳转目标会随变量变化。玩家未接任务时只能看到接取按钮,进行中看到继续或提交按钮,完成后只能看到离开。
二、用条件分支隐藏无效按钮
如果希望某些状态下完全不显示按钮,可以把按钮放在不同段落里,通过 #IF 判断跳转到对应段落。
示例:
[@main]
IF
CHECKITEM 任务道具 0
ACT
GOTO @显示接取
IF
CHECKITEM 任务道具 1
ACT
GOTO @显示提交
IF
ACT
GOTO @已完成
[@显示接取]
SAY
需要接取新手任务吗?\
<接取任务/@接取>\
<离开/@exit>
[@显示提交]
SAY
任务已完成,可以提交奖励。\
<提交任务/@提交>\
<离开/@exit>
[@已完成]
SAY
该任务已结束。\
<离开/@exit>
这种写法比在同一个对话框里堆叠大量判断更清晰。每个段落只输出当前状态需要的按钮,玩家不会看到无效选项。
三、按钮文字动态变化
如果希望按钮文字随任务进度变化,可以使用变量拼接显示内容。不同引擎对变量显示写法略有差异,361引擎需要以实际测试为准。
示例:
[@main]
IF
ACT
GOTO @显示按钮
[@显示按钮]
IF
EQUAL <TASK_STATE> 0
ACT
GOTO @按钮接取
IF
EQUAL <TASK_STATE> 1
ACT
GOTO @按钮继续
IF
EQUAL <TASK_STATE> 2
ACT
GOTO @按钮完成
[@按钮接取]
SAY
当前任务状态:未接取\
<接取任务/@接取>\
<离开/@exit>
[@按钮继续]
SAY
当前任务状态:进行中\
<继续任务/@继续>\
<离开/@exit>
[@按钮完成]
SAY
当前任务状态:已完成\
<领取奖励/@领取>\
<离开/@exit>
这种方式适合任务阶段较多、按钮文字需要频繁变化的情况。变量只负责记录状态,按钮文字和跳转由不同段落分别控制。
四、任务提交后按钮自动切换
任务提交后如果仍显示提交按钮,会导致重复提交。需要在提交成功后修改变量,并跳转到新段落。
示例:
[@提交]
IF
CHECKITEM 任务道具 1
ACT
TAKE 任务道具 1
MOV <TASK_STATE> 2
GIVE 任务奖励 1
SENDMSG 6 任务提交成功,奖励已发放
GOTO @任务已完成
ELSESAY
你身上没有任务道具,无法提交。
这里 #ELSESAY 用于条件不满足时给出提示,避免玩家误以为按钮失效。
五、多任务按钮动态显示
如果 NPC 同时管理多个任务,可以为每个任务使用独立变量。
示例:
[@main]
IF
EQUAL <TASK_A> 0
ACT
GOTO @任务A未接
IF
EQUAL <TASK_A> 1
ACT
GOTO @任务A进行中
IF
EQUAL <TASK_B> 0
ACT
GOTO @任务B未接
IF
EQUAL <TASK_B> 1
ACT
GOTO @任务B进行中
IF
ACT
GOTO @全部完成
[@任务A未接]
SAY
<接取任务A/@接取A>\
<查看任务B/@查看B>\
<离开/@exit>
[@查看B]
IF
EQUAL <TASK_B> 0
ACT
GOTO @任务B未接
IF
ACT
GOTO @任务B进行中
多任务情况下,建议每个任务使用独立变量,例如 <TASK_A>、<TASK_B>,避免状态互相覆盖。
六、按钮触发后刷新对话框
玩家点击按钮后,如果状态发生变化,必须跳转到新段落或重新打开对话框,否则按钮不会立即更新。
错误写法:
[@接取]
IF
ACT
MOV <TASK_STATE> 1
GIVE 任务道具 1
SENDMSG 6 任务已接取
这种写法执行后不会刷新对话框,玩家仍停留在旧界面。正确写法应在执行后 GOTO 到新段落:
[@接取]
IF
ACT
MOV <TASK_STATE> 1
GIVE 任务道具 1
SENDMSG 6 任务已接取
GOTO @任务进行中
七、调试方法
修改任务脚本后,重新加载 NPC 脚本或重启服务端。调试时按以下顺序检查:
任务变量是否正确写入
#IF 判断是否命中预期状态
按钮是否跳转到正确段落
提交后变量是否更新
重复提交是否被拦截
按钮文字是否随状态变化
离开对话框后再打开是否保持最新状态
如果按钮不变化,先确认变量是否被正确修改,再确认是否执行了 GOTO 刷新。如果按钮显示异常,检查 #IF 条件顺序,避免前面的判断提前拦截后续状态。361引擎的具体变量显示写法、命令名称和脚本格式以当前引擎说明和实际测试为准。
361传奇引擎NPC对话框动态按钮显示:任务脚本变量控制与条件分支实战
来源:
作者:
点击:

