传奇引擎明文荣誉大战使者脚本荣誉战场报名与荣誉值兑换完整配置讲解

来源: 作者: 点击:
荣誉大战使者这个NPC,干的是两件事:把玩家送进荣誉战场,以及用打出来的荣誉值换东西。整个脚本就是一个明文txt,挂在盟重或沙巴克门口的广场上,段和段之间靠标签跳转。看着段多,其实归类下来就三块,报名、兑换、排行。下面把这段脚本从头拆到尾,能直接往自己版本里搬。

一、先把NPC挂上去

脚本文件放在 Mir200\Envir\Market_Def 目录下,单独建一个txt,名字随便取,段名统一用 @荣誉大战 开头。接着打开同目录的 MerChant.txt,加一行把它挂到地图上,格式是地图编号、X坐标、Y坐标、NPC名字、脚本文件名、段名:

3 334 340 荣誉大战使者 荣誉大战-3 荣誉大战

最前面的3是MapInfo.txt里盟重土的编号,换成自己版本里广场那张地图的编号。几个数是坐标,站在哪就填哪。文件名要和前面建的那个txt名字对得上,段名要和脚本里第一个段的段名一致。改完保存,到M2控制台点控制,再点重新加载所有NPC,不点这一下,游戏里点NPC是没反应的。

二、主段 [@荣誉大战] 的写法

玩家点NPC第一眼看到的就是这一段,作用是把三个入口列出来:

[@荣誉大战]
#SAY
战场之上,唯有强者留名。
<进入荣誉战场/@进入战场> <荣誉值兑换/@荣誉兑换> <战绩排行/@荣誉排行> <离开/@exit>

段里只有一句招呼和一排按钮。按钮写在尖括号里,斜杠后面跟段名,点一下跳到那个段去执行。<离开/@exit> 里的 @exit 是引擎自带的关闭弹窗,不用自己写段。这里最容易写错的是斜杠,写成 <进入荣誉战场@进入战场> 就成了一行灰字,点不动,不少新手卡在这一步找半天。

三、报名进场的 [@进入战场] 要带条件

战场不是谁想进就进,脚本里先过条件再传送:

[@进入战场]
{
#IF
CHECKLEVELEX > 39
CHECKGOLD 10000
#ACT
TAKE 金币 10000
MAPMOVE HONOR 30 30
SENDMSG 6 已进入荣誉战场,击杀对手可获取荣誉值。
BREAK
#ELSESAY
进入战场需40级以上,并缴纳金币10000。
<返回/@荣誉大战> <离开/@exit>
}

CHECKLEVELEX 管等级,这里设成40级以上才能进,数字按自己版本的玩法改。CHECKGOLD 是检测身上金币够不够。两条都成立才走 #ACT:先把金币收掉,再用 MAPMOVE 把人送进战场地图。HONOR 是地图代码,要去 MapInfo.txt 里核对,自己版本里战场那张图叫什么就填什么,写错代码人会被扔到空白图里。BREAK 是结束本段,不加的话下面的提示也会一起执行,玩家会同时看到进场成功和条件不足两条消息,看着像脚本坏了。

金币不够的走 #ELSESAY,给一句提示,再挂返回和离开两个按钮。这两处按钮别忘了写,只写文字不写按钮,玩家点完就没法回上一级,只能关掉重来。

四、荣誉值从哪来

荣誉值不是脚本凭空发的,是战场里击杀得到的。这里先建立一个荣誉值的记录方式,多数版本用变量存,脚本里用一个全局变量或者玩家变量承接。做法有两种,一种写在战场的杀怪或者杀人事件里,每触发一次给变量加一;另一种挂在 QFunction.txt 的击杀事件上,判定地图是 HONOR 才加分。两种都行,关键是加分的地图判定别漏,不然在城门口砍人也能涨荣誉值,数据就废了。

加分命令按自己引擎的变量命令来写,玩家变量一般形如变量名加一。加完分不弹提示也行,玩家看战场界面里的荣誉值变化即可。

五、荣誉值兑换 [@荣誉兑换] 的写法

这是整个脚本的重头戏。核心逻辑是:给玩家看能换什么,选一个,检测荣誉值够不够,够就把变量扣掉再给东西。

[@荣誉兑换]
#SAY
当前荣誉值:<$荣誉值>
<兑换荣誉勋章/@换勋章> <兑换荣誉战甲/@换战甲> <兑换祝福油/@换祝福油> <返回/@荣誉大战>

<$荣誉值> 是变量直接显示在对话里,玩家一眼看到自己有多少分。三个按钮对应三样东西,另外留一个返回按钮。

每一档兑换段单独写,结构一样,以勋章为例:

[@换勋章]
{
#IF
CHECKVAR 荣誉值 > 49
#ACT
CHECKVAR 荣誉值 - 50
GIVE 荣誉勋章 1
SENDMSG 6 兑换成功,消耗荣誉值50。
#ELSESAY
荣誉值不足50,无法兑换。
<返回/@荣誉兑换> <离开/@exit>
}

CHECKVAR 荣誉值 > 49 是判断变量够不够50,用大于49而不是大于等于50,是因为部分引擎的变量比较命令只认大于和小于,不认大于等于,写成大于49结果一样。检测通过走 #ACT,先把荣誉值减掉50,再用 GIVE 给物品。顺序不能反,先给物再扣分在某些引擎里会因为中断导致只给物不扣分。分不够的走 #ELSESAY 提示,页尾照样挂返回和离开两个按钮。

另外两档照这个结构复制,把物品名字、消耗数量、判断数值三处换掉即可。物品名字必须和物品数据库里的一模一样,库里没有的东西,GIVE 执行了也给不出来。变量名字也要和加分那边用的保持一致,一边用荣誉值一边用荣誉分,等于两套账互相不认。

六、战绩排行 [@荣誉排行] 怎么显示

排行页是把前面若干名玩家的名字和荣誉值列出来。写法上分两种,简单的一种是脚本直接读排行榜接口,把前十名拼进对话里;麻烦的一种是每次有人兑换时往一个榜单文件里写数据,排行页读这个文件。用前者的多,接口命令在脚本里通常是一句拉榜命令,后面跟名次区间,引擎会把名字和数值填进去。

做排行页要注意,榜上的数值是即时值还是上榜那一刻的值。用即时变量显示的话,玩家一边兑换一边分数掉,榜上排名会跟着变,看着乱。稳妥做法是排行只读不收,兑换只在兑换段里扣,两边变量分开引用。

七、脚本不生效常见原因

第一,NPC挂载的段名和脚本里的段名不一致,或者MerChant.txt里地图编号写错,NPC会站在别的图上或者干脆不出现。回控制台重载NPC再找。

第二,按钮点不动,基本是尖括号或斜杠漏了,或者斜杠后面的段名和实际段名差字。引擎对这种情况不报错,就是没反应,只能自己逐个核对段名。

第三,传送后掉到空白地图,是MAPMOVE后面的地图代码和MapInfo.txt对不上,或者那张地图的map文件缺失、客户端补丁没同步。

第四,兑换给了东西分数没扣,或者分数扣了东西没给,是扣分和给物的顺序写反,或者检测命令和扣分命令用的变量名不统一。

第五,条件写明是40级进不去,多半是CHECKLEVELEX那行的数字写错,或者玩家角色数据里等级字段异常。换个号实测一遍最直接。

第六,物品名字写对但换不出来,去看物品数据库里到底有没有这件东西,以及名字里有没有多空格。脚本配得再对,库里没记录也白搭。

八、改动前后的核对顺序

动手之前把 MerChant.txt、这个NPC脚本、涉及到的物品数据库各备份一份,改坏了能立刻还原。

改完按这个顺序过一遍:先确认MerChant.txt里地图编号和坐标对着自己版本;再确认脚本段名和各处按钮里的段名一一对应;接着核对CHECKLEVELEX的等级、CHECKGOLD的金额、CHECKVAR的阈值这三处数字;然后确认兑换物品在数据库里存在、名字一字不差;最后重启服务端,在控制台重新加载所有NPC,拿两个号实测,一个够条件一个不够,看进场、看兑换、看扣分、看排行,四条都对上,这段脚本就算接好了。

搬去自己版本要改的就几处:地图代码、NPC坐标、物品名字、荣誉变量名,其余结构直接沿用。改完别忘重载,很多“脚本没生效”其实是没重载NPC。