当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

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

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

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

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

[@checkmon]
IF

CheckMapMonCount30
ACT

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

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

[@go_zuma]
IF

CheckMapMonCount30
ACT

MAPMOVE0155050
SENDMSG6传送成功
BREAK
ELSEACT

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

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

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

[@go_zuma]
IF

CheckMapMonCount0150
ACT

MAPMOVE0155050
ELSEACT

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

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

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

[@go_zuma]
IF

CheckRangeMonCount50050010000
ACT

MAPMOVE0155050
ELSEACT

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

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

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

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

[@go_zuma]
IF

CheckMapMonCount0150
ACT

MAPMOVE0155050
ELSEACT

SENDMSG6祖玛地图怪物未清空,无法传送
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

CheckMapMonCount0150
ACT

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

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

[@go_zuma]
IF

CheckMapMonCount0150
ACT

MAPMOVE0155050
SENDMSG6传送成功
BREAK
ELSEACT

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

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

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

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

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

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

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

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

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

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

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