传奇传送员脚本:清完地图怪物才允许传送

来源: 作者: 点击:
这个需求核心不是“传送”,是“检测地图剩余怪物数量”。传奇引擎里没有直接的“地图怪物数=0”这种全局变量,但可以用 CheckMapMonCount 或 CheckMapMon 系列命令,不同引擎叫法不同。先确认你用的什么引擎,BLUE、LEGEND、GEE、3K 各有差异,下面给通用写法,再给 BLUE 专用版。

一、BLUE/LEGEND 引擎写法
BLUE 有 CheckMapMonCount 地图号 数量 命令,检测指定地图怪物数量是否等于/大于/小于某个值。写法:

[@main]
欢迎使用清怪传送\
当前地图剩余怪物:<$MAPMONCOUNT>只\
<检测怪物数量/@checkmon>\
<传送去祖玛/@go_zuma>\

[@checkmon]
IF

CheckMapMonCount 3 0
ACT

SENDMSG 6 地图怪物已清空,可以传送
GOTO @main
BREAK
ELSEACT

SENDMSG 6 地图还有怪物,不能传送
GOTO @main
BREAK

[@go_zuma]
IF

CheckMapMonCount 3 0
ACT

MAPMOVE 015 50 50
SENDMSG 6 传送成功
BREAK
ELSEACT

SENDMSG 6 怪物未清空,无法传送
GOTO @main
BREAK

这里 CheckMapMonCount 3 0 意思是“检测地图编号3的怪物数量等于0”,地图编号要换成你实际地图的编号。<$MAPMONCOUNT> 是显示当前地图剩余怪物数的变量,BLUE 里叫这个,其他引擎可能叫 <$MONCOUNT> 或 <$MAPMONSTERCOUNT>。

二、GEE/3K 引擎写法
GEE 用 CheckMapMonCount 也支持,但有的版本要用 CheckMapMonCountEx 或 CheckMapMonsterCount。写法类似:

[@go_zuma]
IF

CheckMapMonCount 015 0
ACT

MAPMOVE 015 50 50
ELSEACT

MESSAGEBOX 怪物未清空,无法传送
BREAK

三、没有 CheckMapMonCount 的老引擎怎么办
老引擎没有直接命令,只能用“变量标记”模拟。原理是:地图刷怪脚本里,每杀一只怪就减一个变量,杀到0才允许传送。但这样要改刷怪脚本,工作量大,而且容易漏。更简单的方法是:用 CheckRangeMonCount 检测某个坐标范围内的怪物数量,把范围设成整个地图。

BLUE 里 CheckRangeMonCount X坐标 Y坐标 范围 数量,如果你地图是 1000x1000,就写:

[@go_zuma]
IF

CheckRangeMonCount 500 500 1000 0
ACT

MAPMOVE 015 50 50
ELSEACT

SENDMSG 6 怪物未清空,无法传送
BREAK

这个命令检测以 (500,500) 为中心、半径1000范围内怪物数量是否为0。如果地图不是正方形,范围要设成能覆盖全图的最大值。缺点是范围太大可能卡服务器,小地图可以用。

四、更严谨的写法:配合地图刷怪脚本
如果你要“清完当前地图所有怪才能走”,但传送员站在安全区,玩家从安全区去别的地图,那要检测的是“目标地图”的怪物,不是传送员所在的地图。所以 CheckMapMonCount 后面的地图号要写目标地图的编号,不是当前地图。

比如玩家在土城,想去祖玛,传送员在土城,那要检测祖玛地图(编号015)的怪物:

[@go_zuma]
IF

CheckMapMonCount 015 0
ACT

MAPMOVE 015 50 50
ELSEACT

SENDMSG 6 祖玛地图怪物未清空,无法传送
BREAK

五、怪物数量显示优化
想实时显示目标地图剩余怪物,用变量:

[@main]
祖玛地图剩余怪物:<$STR(MONCOUNT_015)>只\
<传送去祖玛/@go_zuma>\

但 <$STR(MONCOUNT_015)> 这种变量不一定存在,BLUE 里可以用 CheckMapMonCount 配合 MOV 存值,但比较麻烦。简单做法是显示当前地图怪物数,或者不显示,只提示“怪物未清空”。

六、完整脚本模板(BLUE版)
假设传送员在土城,目标地图是祖玛(编号015),地图大小约 500x500:

(@@InPutInteger )
[@main]
<清怪传送服务>\
当前地图剩余怪物:<$MAPMONCOUNT>只\
<查看祖玛怪物数量/@check_zuma>\
<传送去祖玛/@go_zuma>\
<离 开/@exit>\

[@check_zuma]
IF

CheckMapMonCount 015 0
ACT

SENDMSG 6 祖玛地图怪物已清空,可以传送
GOTO @main
BREAK
ELSEACT

SENDMSG 6 祖玛地图还有怪物,不能传送
GOTO @main
BREAK

[@go_zuma]
IF

CheckMapMonCount 015 0
ACT

MAPMOVE 015 50 50
SENDMSG 6 传送成功
BREAK
ELSEACT

SENDMSG 6 祖玛地图怪物未清空,无法传送
GOTO @main
BREAK

七、测试方法
1. 把脚本存成 传送员.txt,放到 Envir\Market_Def\ 或 Market_Sell\ 里。
2. 在 Merchant.txt 里加一行,指定NPC名字、地图、坐标、文件名:
传送员 3 330 330 传送员 0
3. 重启 M2 或 @reloadnpc。
4. 游戏里点传送员,先点“查看祖玛怪物数量”,如果提示“还有怪物”,去祖玛把怪清完,再回来点传送,应该能传。

八、常见坑
• CheckMapMonCount 后面的地图编号必须是数字,不能写地图名。祖玛地图编号在 M2 的地图配置里查,不是所有服都是015。

• CheckRangeMonCount 的范围设太大可能卡服,设太小覆盖不全。先查地图实际大小,再设范围。

• 有些引擎的 CheckMapMonCount 是检测“当前地图”而不是指定地图,写法要变成 CheckMapMonCount 0(不带地图号),具体看引擎帮助。

• 传送后如果目标地图又刷怪了,玩家会被困住,所以传送前要确认目标地图的刷怪机制,如果是定时刷怪,清完立刻传,别等刷出来。

• 怪物数量为0但还有BOSS没死,有些引擎把BOSS单独算,CheckMapMonCount 可能不统计BOSS,要配合 CheckMapBossCount 或 CheckMapMonCount 加参数。

九、GEE/3K 补充
GEE 里命令是 CheckMapMonCount 地图号 数量,但有的版本要写 CheckMapMonCount 地图号 操作符 数量,比如 CheckMapMonCount 015 < 1。3K 引擎类似,查你引擎的“地图怪物检测”命令说明。

十、如果引擎完全没有怪物数量检测命令
那就只能用“杀怪计数”方案:
1. 在刷怪脚本里,每刷一只怪,变量加1。
2. 在 QFunction 的 [@KillMon] 里,每杀一只怪,变量减1。
3. 传送员脚本里检测变量是否为0。

但这样要改刷怪脚本和杀怪触发,工作量大,而且如果怪物被其他玩家杀了,变量也能减,没问题;如果怪物被刷新时间清掉(不通过击杀),变量就不会减,会卡住。所以能直接用 CheckMapMonCount 就用,别绕。

十一、最终建议
先用 CheckMapMonCount 测试。在 M2 的脚本帮助里搜“CheckMapMonCount”或“地图怪物”,看你的引擎支不支持。支持就直接用,不支持就换 CheckRangeMonCount,再不行才用变量计数方案。你的需求本质是“地图怪物数量=0才放行”,只要引擎能检测地图怪物数,脚本就很简单;检测不了,就得靠刷怪和杀怪两侧配合,麻烦但也能实现。