把落点交给玩家自己定,这是定向传送跟回城、随机飞最大的不同。回城卷替你决定了去哪,随机飞干脆不看落点。定向传送要求脚本先接住玩家这一次的选择,挑清单上的某个地点、敲一组坐标,或者调用提前存好的位置,再把这组值交给引擎执行。听起来简单,真写起来容易卡在三处:地图号写错、坐标越界、不同引擎的命令名字对不上。下面按从查到写、从单人到全服的顺序捋一遍。
一、先确认两个值:地图号和目标坐标
脚本里所有传送动作都靠地图号和坐标定位,这两个值错了,语法再正确也白搭。地图号藏在服务端的 MapInfo.txt 里,形如 [3 土城],方括号里第一个数字就是地图号。写脚本时地图号比地图名更稳,地图名改动或者带空格时用编号不容易出岔子。
当前站在哪张图、哪个点,脚本可以直接取。多数引擎用 <
𝑀
𝐴
𝑃
>
拿当前地图号,
MAP>拿当前地图号,CURRENTMAP 拿地图名或编号,<
𝐶
𝑈
𝑅
𝑅
𝐸
𝑁
𝑇
𝑋
>
和
<
CURRENTX>和<CURRENTY> 拿人物当前横纵坐标,也有一部分引擎写成 <
𝑋
>
和
<
X>和<Y>。不确定用哪个,把鼠标停在编辑器里那条命令上,提示会列出参数和取值,比翻文档快。
临时看一眼地图号,可以挂一个查询脚本:
text
[@查看地图]
#ACT
messagebox 当前地图号:<$MAP>
坐标怎么选有讲究。落点尽量定在开阔地,别压在墙角、树丛或者地图边界之外,否则玩家传过去会卡住,甚至直接落空。传送点最好在地图的安全区参数里标一下,减少被怪堵门的麻烦。
二、传送命令在不同引擎里名字不一样
这是新手最容易踩的坑。同一件事,换个引擎命令就换了名字,照搬别人的脚本自然不生效。
GEE 和 GOM 这一系用 MAPMOVE 地图号 X Y,也支持把某张图全体玩家搬走的重载写法。BLUE 引擎用 MoveHum,HGE 引擎用 MoveMapHuman,参数顺序相近。老版本里 mapmove 地图名 坐标A 坐标B 也一直在用,地图名位置既能填编号也能填名字。只想随机落点,用 MAP 地图号 就够了。组队相关的命令单列:GROUPMAPMOVE 地图号 X Y 最低等级 触发字段 是队长带队定点过去,GROUPMOVE 地图号 最低等级 触发字段 是不指定坐标的随机带队。装了神盾插件的版本还能用 SDMAPMOVEEX 地图 坐标A 坐标B 随机值,末尾的随机值表示落点在目标点上下浮动多少格。
一个最小的定点传送块长这样:
text
[@main]
#IF
#ACT
MAPMOVE 3 333 333
这里的地图号和坐标要换成你自己的。
三、NPC 清单式定向传送
玩家在 NPC 对话里点一个地名,人就被送到那。这是服务器里最常见的一种定向传送。做法是先把目的地列成可点击的选项,每个选项挂一个标签,标签里执行传送。带条件的版本还要加等级、金币、元宝或者物品的检测。
text
[@main]
土城传送使
<前往苍月岛/@go_cangyue> <前往魔龙城/@go_molong>
[@go_cangyue]
#IF
CheckLevel 40
#ACT
MAPMOVE 5 120 120
SENDMSG 6 已到达苍月岛
#ELSEACT
SENDMSG 6 等级不足40级,暂时无法前往
[@go_molong]
#IF
CheckGold 100000
#ACT
TAKEGOLD 100000
MAPMOVE 6 240 240
#ELSEACT
SENDMSG 6 金币不足,传送需要十万金币
CheckLevel 查等级,CheckGold 查金币,元宝检测换成对应的元宝命令,物品检测用 CheckItem 物品名 数量。几样条件一起写在 #IF 下面,全部满足才会往下走。条件不满足时给一句明确的提示,别让玩家点了没反应,这是新手脚本被吐槽最多的地方。
四、让玩家自己敲坐标
清单总有列不完的时候,于是不少版本干脆开放坐标输入。引擎提供两种输入框:@@InPutInteger 收数字,玩家填的值自动存进 N 变量;@@InPutString 收文本,存进 S 变量。后面的小数是变量槽位,@@InPutInteger85 填的数字会存进 N85。
text
[@main]
请输入横坐标 <输入/@@InPutInteger85>
请输入纵坐标 <输入/@@InPutInteger86>
[@CallInPutInteger85]
#IF
#ACT
MAPMOVE <$MAP> <$STR(N85)> <$STR(N86)>
这里有个必须留意的引擎差异。Hero 这一系要求回调标签加 Call 前缀,写成 @CallInPutInteger85,3K 和 HGE 直接拿输入框的标签名当回调,写成 @InPutInteger85。同一段脚本在这两类引擎之间来回搬,标签名字要对上号才能跑。文本输入还需要过滤非法字符,服务端一般会跳到 @MsgFilter 或 @IsInFilterList 这类过滤标签,可以在那里提示重新输入。
拿变量当参数时记得套 <$STR(变量名)>,少写这层或者括号写错,传送就会失败,或者把玩家扔到坐标 0 上。
五、传送石、传送戒指这类物品怎么触发
物品触发的传送,重点在数据库和触发脚本两头对上。物品分类号 StdMode 填 31,AniCount 那栏填一个编号,双击物品时服务端就会去 QFunction 脚本里找 @StdModeFunc 加上这个编号的标签执行。AniCount 填 100,触发标签就是 @StdModeFunc100。
text
[@StdModeFunc100]
#IF
#ACT
MAPMOVE 3 333 333
SENDMSG 6 回到土城
记忆石是这类道具里做得最巧的。它先把玩家当前的位置记下来,再一键传送回去,靠的是 TAGMAPINFO 记录和 TAGMAPMOVE 取用,配合 <
𝑇
𝐴
𝐺
𝑀
𝐴
𝑃
𝑁
𝐴
𝑀
𝐸
1
>
、
<
TAGMAPNAME1>、<TAGX1>、<$TAGY1> 这组变量显示存档位置:
text
[@StdModeFunc99]
#ACT
记录当前位置 <记录/@save1> 回到记录点 <移动/@move1>
[@save1]
#ACT
TAGMAPINFO 1
GOTO @StdModeFunc99
[@move1]
#ACT
TAGMAPMOVE 1
想去哪、记哪、回哪都由玩家自己说了算,比固定几个传送点灵活得多。
六、队长带全队定向集结
行会和组队对传送的需求跟单人不同,一次要把整队人送走。用 GROUPMAPMOVE,只有队长触发有效,可以卡一个最低等级,等级不够的队员被跳过。
text
[@main]
#IF
ISGROUPMASTER
#ACT
GROUPMAPMOVE 3 333 333 1 @GROUPMAPMOVE
[@GROUPMAPMOVE]
#ACT
SENDMSG 6 全队已集结
ISGROUPMASTER 用来确认当前点击的人是不是队长,不是队长的玩家点这个 NPC 不该有动静。等级门槛填得比队伍平均等级低一点,免得因为一个低级小号卡住整队。
七、冷却、延迟和防乱飞
传送类脚本最容易被人拿来做文章,挂机工具盯上它就能无限飞。两条防线,一条延迟,一条冷却。
延迟靠 DELAYGOTO,单位是毫秒:
text
[@main]
<传送到盟重/@DelayGoto>
[@DelayGoto]
#IF
#ACT
DELAYGOTO 3000 @DelayLabel
#SAY
正在处理数据,请稍候
[@DelayLabel]
#ACT
MAPMOVE 3 330 330
玩家点下去要等三秒才真正落点,中间想用别的手段插队就没那么容易。配套的 CLEARDELAYGOTO 能把还没执行的延迟跳转清掉。DELAYGOTO 的最小精度跟引擎有关,填 20 毫秒实际可能被拉到几十毫秒,别指望它卡到毫秒级。
冷却更适合放在物品上。给传送石加一个个人定时器,用完启动计时,计时没走完就拒绝使用:
text
[@StdModeFunc100]
#IF
CheckItemAddValue 传送石 0 < 1
#ACT
MAPMOVE 3 333 333
SetItemAddValue 传送石 0 + 1
SetOnTimer 6 60
SendMsg 6 传送成功,60 秒后才能再用
#ELSEACT
SendMsg 6 冷却中,稍等
[@OnTimer6]
#IF
#ACT
SetItemAddValue 传送石 0 - 1
SetOffTimer 6
这里用物品的自定义属性值当计数器,省下一个人物变量。个人定时器要在 QManage 脚本里注册,编号不注册是不会跑的,改完脚本点一次重新加载。
八、全服定点批量转移
活动开场、攻城集合、整点清场这类场景,需要把某张图上的所有玩家一次性搬走,跟玩家点不点 NPC 无关。做法是用机器人脚本定时触发,再执行集体传送。
在 Robot_def 目录的 AutoRunRobot.txt 里挂上时间点和标签:
text
[AutoRunRobot]
SEC = 10 20:00:00 @整点转移
在 System 目录的 RobotManage.txt 里写标签内容:
text
[@整点转移]
#IF
#ACT
MapMove 3 5 100 100
AddTextList .\Logs\传送记录.txt [<$DATETIME>] 转移玩家至 5 号图
上面那条把 3 号图的所有玩家送到 5 号图的 100,100。人一多全堆在同一个点容易卡,让落点散开更好:
text
#ACT
MOVR N1 85
INC N1 30
MOVR N2 85
INC N2 30
MapMove 3 5 <$STR(N1)> <$STR(N2)>
这段把落点控制在 85 到 115 之间随机,人群铺开来,门口不至于堵死。
九、跑不通时按这个顺序查
传送脚本不生效,先别急着改代码,按下面几步走,多数问题能当场定位。
一看地图号。目标地图号是不是 MapInfo.txt 里真实存在的,坐标有没有超出地图实际尺寸,越界的坐标传过去会失败,或者把人扔进墙里。
二看 NPC 有没有被加载。服务端启动日志会打印每条脚本的加载结果,脚本没加载,点 NPC 自然毫无反应。名字或编号在 Merchant 配置和脚本定义之间对不上,会出现同样的情况。
三看文件编码。脚本文件要存成 ANSI,用别的编码保存,里面的汉字和标签都会乱,轻则不生效,重则启动就报 load fail。
四看变量类型。N、P、D 这几类变量下线就清空,U 变量才能在下线重登后保留。做冷却、做记录点这类需要存住的逻辑,选错变量会导致玩家小退一次功能就失灵。
五看空格和标点。命令和参数之间用半角空格隔开,多一个少一个都会让引擎解析失败,中文标点混进命令行同样不行。这类问题最不起眼,也最耗时间。
这几步过一遍,剩下的基本就是命令名字没对上引擎这一种可能了,回头对照第二节的差异改一下就行。
上面这篇正文同时输出成了两份可留存的文件:一份是便于复制、再编辑的纯文稿,一份是排版好的网页版,直接双击即可在浏览器里阅读、也能贴到自己站点上。
发布版.html
HTML 12.37KB
查看
事实核验:文中地图号来源、命令名与参数(MAPMOVE / MoveHum / MoveMapHuman / GROUPMAPMOVE / GROUPMOVE / SDMAPMOVEEX / DELAYGOTO / TAGMAPMOVE / @@InPutInteger 等)均对照公开的引擎命令说明逐条核对,示例坐标与物品编号为演示值,实际使用时请换成你自己服务端的真实数值。
传奇引擎玩家定向传送脚本怎么写?NPC选点、传送石指定坐标与批量转移命令完整实现教
来源:
作者:
点击:

