LegendM2引擎的押镖系统依赖引擎内置的ESCORT系列命令,核心逻辑是STARTESCORT创建镖车、ISESCORTING检测押运状态、FINISHESCORT提交任务,配合QMapEvent-0.txt中的劫镖触发标签实现完整的护送玩法。脚本不需要手动生成怪物作为镖车,引擎会自动在玩家身边创建Race=54的镖车单位,跟随玩家移动。下面按文件注册、接镖脚本、交镖脚本、劫镖触发、每日限次、地图参数和常见报错七个方面拆解。
## NPC注册与脚本文件配置
镖局NPC需要在MerChant.txt中注册。打开 `Mir200\Envir\MerChant.txt`,在文件末尾追加一行:
```
镇远镖局 3 330 330 镇远镖局 0 102 0
```
这行配置的含义是:NPC名称为镇远镖局,所在地图编号3(盟重省),坐标(330,330),NPC外观编号102,朝向0。地图编号和坐标根据版本实际情况调整,改完后NPC会出现在对应位置。
脚本文件放在 `Mir200\Envir\Market_Def\` 目录下,文件名必须为“镇远镖局-3.txt”,后缀中的-3代表地图编号,与MerChant.txt中配置的地图编号一致。如果NPC放在比奇省(地图编号0),文件名改为“镇远镖局-0.txt”,MerChant.txt中的地图编号同步改为0。
镖车的怪物数据需要写入Monster.DB,Race字段设置为54或153。Race=54的镖车为普通跟随型,Race=153的镖车支持更复杂的移动逻辑。如果不确定当前引擎版本支持哪种Race值,先尝试54,测试通过后再切换153对比效果。
## 接镖脚本完整写法
接镖的核心命令是STARTESCORT,格式为 `STARTESCORT 镖车名称`,执行后引擎在玩家身边创建一个指定名称的镖车单位,玩家自动进入押运状态。配合ISESCORTING检测押运状态,防止玩家同时接取多辆镖车。
NPC主界面列出不同档位的镖车选项:
```
[@main]
#IF
ISESCORTING
#ACT
MESSAGEBOX 你当前已经有镖车在押运中,不能重复接取。
BREAK
#SAY
镇远镖局承接各类押运业务。\
<押运黄金镖车/@黄金镖车>(押金:<COLOR=16776960 55000>元宝)\
<押运白银镖车/@白银镖车>(押金:<COLOR=16776960 25000>元宝)\
<注销当前任务/@注销>\
<关闭/@exit>\
[@黄金镖车]
#IF
CHECKGAMEGOLD > 54999
#ACT
GAMEGOLD - 55000
STARTESCORT 黄金镖车
CALCVAR HUMAN MLBC + 1
SAVEVAR HUMAN MLBC ..\QuestDiary\变量\个人变量储存.txt
SENDMSG 0 〖%s〗押运着〖黄金镖车〗前往土城书店! 251 249
SENDMSG 6 请在45分钟内将镖车送到土城书店老板处,超时镖车消失。
#ELSESAY
你的元宝不足55000,不能接受此镖车。\
[@白银镖车]
#IF
CHECKGAMEGOLD > 24999
#ACT
GAMEGOLD - 25000
STARTESCORT 白银镖车
CALCVAR HUMAN MLBC + 1
SAVEVAR HUMAN MLBC ..\QuestDiary\变量\个人变量储存.txt
SENDMSG 0 〖%s〗押运着〖白银镖车〗前往土城书店! 251 249
SENDMSG 6 请在45分钟内将镖车送到土城书店老板处,超时镖车消失。
#ELSESAY
你的元宝不足25000,不能接受此镖车。\
[@注销]
#IF
ISESCORTING
#ACT
GiveUpEscort
MESSAGEBOX 任务注销成功!
#ELSESAY
你没有镖车,无法注销任务。\
```
ISESCORTING放在[@main]的第一个判断位,玩家有镖车在身时直接弹出提示框并跳出,不显示接镖选项。STARTESCORT后面的镖车名称必须与Monster.DB中注册的镖车怪物名称一致,引擎会按名称查找对应的怪物数据来生成镖车单位。
CALCVAR HUMAN MLBC + 1 把人物自定义变量MLBC的值加1,记录当日已押镖次数。SAVEVAR命令把变量值写入文本文件持久化保存,路径 `..\QuestDiary\变量\个人变量储存.txt` 中的“..”代表返回脚本所在目录的上一级。如果服务端的QuestDiary目录下没有“变量”这个子文件夹,需要手动创建,否则SAVEVAR命令会报路径错误。
GiveUpEscort命令放弃当前押运任务,镖车消失,押金不退。注销功能用于玩家卡镖或不想继续押运时主动清理状态,避免押镖标识一直激活导致无法接取新任务。
## 交镖脚本完整写法
镖车目的地是土城书店老板NPC,交镖脚本写在该NPC的对话文件中。核心命令是FINISHESCORT,执行后销毁镖车、清空押运状态并发放奖励。
交镖前必须先检测镖车是否在身边。CheckEscortInNear命令用于检测玩家与镖车的距离,距离超出限制时不允许交镖,防止玩家把镖车丢在半路自己跑来交任务:
```
[@main]
#IF
ISESCORTING
#ACT
#SAY
你是来交镖的吗?\
<提交押运任务/@交镖>\
<关闭/@exit>\
#ELSESAY
你有什么事?\
[@交镖]
#IF
CheckEscortInNear
#ACT
FINISHESCORT
ADDEXP 5000000
GIVEGOLD 100000
SENDMSG 6 押运任务完成!获得经验值和金币奖励。
SENDMSG 0 〖%s〗成功完成了镖车押运任务! 251 249
BREAK
CLOSE
#ELSESAY
你的镖车不在身边,无法核查货物,请将镖车带到附近再提交。\
```
CheckEscortInNear检测镖车与玩家的距离是否在有效范围内,检测通过才执行FINISHESCORT提交任务。如果玩家把镖车扔在半路自己跑到书店老板处,检测不通过,脚本走#ELSESAY提示镖车距离太远。这个检测没有参数,引擎内部有默认的距离阈值,通常在5格左右。
FINISHESCORT后面的奖励发放命令按版本需求自行调整。ADDEXP和GIVEGOLD是最基础的奖励类型,如果需要发放元宝改用GAMEGOLD + 数量,发放物品用GIVE 物品名称 数量。
## 劫镖触发与PK处理
镖车被其他玩家击杀时,引擎会自动触发QMapEvent-0.txt中的 `[@Plunder_镖车名]` 段落。镖车名替换为Monster.DB中注册的实际名称,例如镖车叫“黄金镖车”,触发标签就是 `[@Plunder_黄金镖车]`。这个段落中支持 `<$ROBBER>` 变量,返回被抢劫玩家的角色名:
```
[@Plunder_黄金镖车]
#ACT
SENDMSG 0 <$ROBBER>的镖车在<$CURRENTMAPDESC>(<$CURRENTX>/<$CURRENTY>)被<$USERNAME>抢劫了! 251 249
SENDMSG 6 你的镖车被<$USERNAME>劫走,押运任务失败。
BREAK
```
`<$ROBBER>` 是被抢劫玩家(即押镖者)的名称,`<$USERNAME>` 是当前击杀镖车的玩家名称。`<$CURRENTMAPDESC>` 返回当前地图名称,`<$CURRENTX>` 和 `<$CURRENTY>` 返回击杀发生时的坐标。
镖车被攻击但尚未死亡时,引擎触发 `[@EscortUnderFire]` 段落,用于给押镖玩家发送被攻击提示:
```
[@EscortUnderFire]
#ACT
SENDMSG 6 你的镖车正在遭受攻击!请尽快返回保护!
BREAK
```
劫镖成功后的奖励发放逻辑写在QMapEvent-0.txt的抢劫触发段落中。常见的做法是给劫镖者发放元宝或劫银,同时把押镖者的押运状态清空:
```
[@Plunder_黄金镖车]
#IF
ISESCORTING
#ACT
SENDMSG 0 <$ROBBER>的镖车在<$CURRENTMAPDESC>(<$CURRENTX>/<$CURRENTY>)被<$USERNAME>抢劫了! 251 249
GAMEGOLD + 10000
SENDMSG 6 你抢劫了<$ROBBER>的镖车,获得10000元宝。
BREAK
```
GAMEGOLD + 10000给劫镖者发放奖励。ISESCORTING条件判断确保押镖者确实在押运状态中,避免异常情况下的误触发。镖车被击杀后,押镖者的ISESCORTING状态会自动清除,不需要手动处理。
如果版本中需要劫镖者有一定等级限制或PK值限制,在@Plunder段落中增加CHECKLEVEL或CHECKPKPOINT条件判断。劫镖成功后押镖者的押金不退,这是设计上的惩罚机制。
## 每日押镖次数限制
限制每日押镖次数需要两个环节配合:接镖时检测次数并累加,每天零点重置计数。
接镖脚本中增加次数检测。上面的[@黄金镖车]段落中已有 CALCVAR HUMAN MLBC + 1 和 SAVEVAR命令,但缺少次数上限判断。完整的检测逻辑是在接镖前先CHECKVAR HUMAN MLBC的值:
```
[@黄金镖车]
#IF
CHECKvar HUMAN MLBC > 2
#ACT
MESSAGEBOX 你今日已完成3次押镖,请明天再来!
BREAK
#IF
CHECKGAMEGOLD > 54999
#ACT
GAMEGOLD - 55000
STARTESCORT 黄金镖车
CALCVAR HUMAN MLBC + 1
SAVEVAR HUMAN MLBC ..\QuestDiary\变量\个人变量储存.txt
SENDMSG 0 〖%s〗押运着〖黄金镖车〗前往土城书店! 251 249
#ELSESAY
你的元宝不足55000,不能接受此镖车。\
```
CHECKvar HUMAN MLBC > 2 检测当日已押镖次数是否超过2次,超过则弹出提示并跳出。MLBC从0开始计数,第1次押镖后变成1,第2次变成2,第3次变成3。CHECKvar > 2 在第3次押镖完成后的第4次接镖时触发,此时玩家已经完成了3次,不允许再接。
每日零点重置需要在AutoRunRobot.txt中增加定时任务,然后在RobotManage.txt中编写重置脚本。AutoRunRobot.txt中追加:
```
#AutoRun NPC RUNONDAY 0:00 @重置押镖次数
```
RobotManage.txt中编写重置段落:
```
[@重置押镖次数]
#ACT
CLEARNAMELIST ..\QuestDiary\变量\个人变量储存.txt
SENDMSG 0 每日押镖次数已重置,所有玩家可继续接取押镖任务。
BREAK
```
CLEARNAMELIST清空变量储存文件,所有玩家的MLBC变量值归零。如果版本中使用了多个变量文件存储不同的个人数据,不能直接清空整个文件,需要编写逐行读取并过滤的脚本,只清除MLBC相关的行。
## 镖车自动寻路配置
LegendM2引擎的镖车默认跟随玩家移动,玩家走镖车走,玩家停镖车停。如果需要镖车按固定路线自动寻路,需要在AutoFindRout.txt中配置路线坐标点。这个文件位于 `Mir200\Envir\AutoFindRout.txt`,格式为地图编号 X坐标 Y坐标,每一行是一个路径点:
```
3 333 333
3 350 350
3 380 380
0 330 330
```
镖车会依次经过这些坐标点自动移动,不需要玩家手动带路。实际配置时坐标点需要根据MapInfo.txt中的地图传送点对照修改,确保路线上的每个坐标点都是可达的。
部分引擎版本支持Dartmap命令在脚本中动态设置镖车寻路目标,格式为 `Dartmap 起始X 起始Y 0 目标X 目标Y 人物离镖车几格内镖车自动寻路`。最后一个参数填范围值(1到12格),填0或留空表示不检测玩家与镖车的距离,镖车始终按设定坐标自动移动。
镖车跨地图时需要使用MAPMOVE命令。先判断镖车当前所在地图,到达地图边界坐标后执行MAPMOVE把镖车传送到下一张地图的起点坐标,然后在新的地图中继续自动寻路。这个逻辑需要写在QMapEvent-0.txt的镖车移动触发段落中,按地图顺序逐段处理。
## 地图参数配置
押镖路线上经过的地图需要在MapInfo.txt中配置禁止随机传送和禁止回城等参数,防止玩家用传送道具跳过押镖路线。打开 `Mir200\Envir\MapInfo.txt`,在押镖路线经过的地图定义行中追加参数:
```
[3 盟重省] NOPOSITIONMOVE NORANDOMMOVE NORECONNECT(3)
```
NOPOSITIONMOVE禁止坐标移动类道具,NORANDOMMOVE禁止随机传送卷,NORECONNECT(3)控制掉线后的重连目标。这些参数确保玩家在押镖过程中无法通过传送道具逃避劫镖或缩短押运时间。如果只对押镖路线上的特定地图段生效,可以为这些地图创建独立的地图编号并单独配置参数。
## 常见报错与排查
STARTESCORT执行后镖车没有出现,先检查Monster.DB中是否注册了对应名称的镖车怪物。镖车名称必须与STARTESCORT后面的参数完全一致,包括空格和标点符号。Race字段确认设置为54或153,其他Race值的怪物不会以镖车形式跟随玩家。
ISESCORTING检测始终不成立,检查脚本中ISESCORTING是否写在了#IF段落内。ISESCORTING是条件判断命令,只能放在#IF中,写在#ACT中不会产生检测效果。同时确认引擎版本是否支持该命令,部分老版本LegendM2中ISESCORTING的名称为CheckEscort。
劫镖触发不执行,检查QMapEvent-0.txt中的段落标签格式。正确的格式是 `[@Plunder_镖车名]`,镖车名替换为Monster.DB中的实际名称,下划线不能省略。段落标签区分大小写,写错任何一个字符都会导致触发失效。同时确认QMapEvent-0.txt文件是否存在于 `Mir200\Envir\` 目录下,文件编码必须为ANSI。
CheckEscortInNear检测通过但FINISHESCORT不执行,检查交镖脚本中CheckEscortInNear和FINISHESCORT是否在同一个#ACT段落内。两个命令之间不能插入条件判断或跳转命令,否则执行流程会在中间中断。如果需要多个前置条件,把CheckEscortInNear放在第一个#IF中,其他条件用AND连接或另起一个#IF段落。
修改脚本后重启M2Server,或在控制台执行 `@ReloadManage` 重新加载Market_Def目录下的NPC脚本,同时用 `@ReloadRobot` 重新加载机器人脚本。修改Monster.DB后需要在M2控制台重载怪物数据库。所有脚本文件必须保存为ANSI编码,UTF-8编码下中文字符串乱码,虽然英文命令STARTESCORT和FINISHESCORT本身不受影响,但脚本中的中文NPC名称和镖车名称如果出现乱码,会导致名称匹配失败。
传奇LegendM2引擎镇远镖局押镖脚本完整写法 从接镖命令到劫镖触发与地图参数配置详解
来源:
作者:
点击:

