在传奇游戏中,NPC脚本是赋予NPC“生命力”的核心。通过编写脚本,你可以让商店NPC卖货、任务NPC发放奖励、功能NPC传送玩家、检测玩家的状态(如是否结婚、有没有徒弟)、甚至召唤强大的宝宝。无论你是GM管理服务器,还是想学习脚本制作的玩家,了解这些基础命令都是第一步。
核心结构-NPC脚本的基本框架
一个典型的NPC脚本通常包含以下几个部分:
触发条件:玩家点击NPC后,脚本开始执行。通常以[@main]开始,后面可以跟其他标签如[@giveitem][@checkmarry]等。
显示文本:使用引号""包裹的文字,用于显示给玩家的对话信息。
脚本命令:实际执行操作的指令,以#IF#ACT#SAY#ELSEACT等关键字引导。
选项按钮:使用<>包裹的文字,供玩家点击触发后续脚本块(跳到其他标签)。
示例:最简单的问候脚本
[@main]
SAY
欢迎你,勇敢的冒险者!有什么需要帮忙的吗?\
<买东西/@buy><了解一下/@info><离开/@exit>
@main:脚本入口标签。
#SAY:后面的文字会显示在对话框里。\是换行符。
<>:玩家可以点击的按钮,点击后会跳转到对应的标签(如点击“买东西”会执行[@buy]段脚本)。
@exit:通常是一个关闭对话框的命令。
重要脚本命令详解
现在,让我们深入到你想了解的具体功能:
一、物品相关命令(给东西、收东西、检查物品)
GIVE/GIVEITEM
功能:给玩家物品。
格式:GIVE物品名数量
示例:
#IF
...(条件,例如检测任务完成)
#ACT
GIVE金条1//给玩家1个金条
GIVEITEM裁决之杖1//给玩家1把裁决之杖
TAKE
功能:收取玩家的物品。
格式:TAKE物品名数量
示例:
#IF
CHECKITEM金条1//条件:检查玩家是否拥有1个金条
#ACT
TAKE金条1//收取玩家1个金条
CHECKITEM/CHECKGOLD/CHECKITEMW
功能:检查玩家是否拥有指定物品或金钱。
格式:
CHECKITEM物品名数量:检查背包是否有指定数量的某物品。
CHECKGOLD数量:检查玩家金币是否大于或等于指定数量。
CHECKITEMW物品名数量:检查玩家身上是否穿着/装备着指定数量的某物品(如武器、衣服)。
示例:(常和#IF#ELSEACT配合使用)
#IF
CHECKITEM求婚戒指1
#ACT
#SAY
你带着象征爱情的求婚戒指!\
<求婚仪式/@marry>
#ELSEACT
#SAY
想要求婚?先准备好一枚求婚戒指吧!\
<离开/@exit>
二、检测关系状态命令(结婚、师徒)
CHECKMARRIED/CHECKMARRIAGE
功能:检测玩家是否已经结婚。
格式:CHECKMARRIED
常用参数(可能版本不同有差异):有时需要指定是检测自己的状态还是检测目标的状态。通常目标玩家(如配偶)名字可以通过变量传递。
示例(检测自己是否已婚):
#IF
CHECKMARRIED//检测当前点击NPC的玩家是否已婚
#ACT
#SAY
你已经有了相伴一生的爱人,祝福你们!\
<查看夫妻属性/@checkcouple>
#ELSEACT
#SAY
单身贵族?来参加我们的联谊活动吧!\
<报名相亲/@date>
CHECKMASTER/CHECKSLAVE/CHECKSLAVECOUNT
功能:检测玩家的师徒关系。
格式(常见):
CHECKMASTER:检查玩家是否有师父。
CHECKSLAVE:检查玩家是否有徒弟。
CHECKSLAVECOUNT:检查玩家当前有多少个徒弟(通常在检测收徒上限时使用)。
示例(检测是否有师父):
#IF
CHECKMASTER//检测当前玩家是否有师父
#ACT
#SAY
你已经有了一位指引你前进的师父了。\
<看望师父/@visitmaster>
#ELSEACT
#SAY
英雄之路,怎能少了名师指点?来寻找你的师父吧!\
<发布拜师信息/@findmaster>
三、传送命令(移动到指定地图/坐标)
MAP/MAPMOVE
功能:将玩家传送到指定的地图(默认坐标或指定坐标)。
格式:
MAP地图编号/地图名:传送到该地图的默认安全区坐标。
MAPMOVE地图编号/地图名X坐标Y坐标:精确传送到地图的指定坐标(XY)。
示例:
#ACT
MAP0//传送到盟重土城(假设0是土城的地图编号)
MAPMOVED7175050//传送到"魔龙城(D717)"地图的坐标(5050)
MAP沙巴克城//如果地图名是文本,需要引擎支持或配置文件中映射好
四、召唤宝宝命令(召唤宠物/神兽等)
RECALLMOB
功能:在玩家身边召唤一个指定的怪物作为宝宝。
格式:RECALLMOB怪物名宝宝等级(可选)持续时间(可选,单位秒)
重要参数:
怪物名:必须是引擎数据库(Monster.DB/Dbserver)里存在的怪物名称。
等级:(可选)召唤出的宝宝的等级。
时间:(可选)宝宝存在的时间(秒)。不填通常是永久(或直到被杀死/地图刷新)。
示例:
#ACT
RECALLMOB神兽//召唤一只名为"神兽"的永久宝宝
RECALLMOB月灵3300//召唤一只3级"月灵",5分钟后消失
注意事项:
玩家必须有召唤宝宝的技能(如召唤神兽)且达到技能要求等级(如果引擎有设定)。
引擎通常有宝宝数量上限(如RecallMobCountLimit)设置。
宝宝死亡或被刷掉后需要重新召唤。
五、其他常用基础命令
#IF/#ACT/#SAY/#ELSEACT/#ELSESAY
功能:脚本执行流程控制核心。
逻辑:
#IF:定义检测条件(如CHECKITEMCHECKMARRIED等)。
如果#IF条件满足,则执行后面的#ACT(执行动作命令)和/或#SAY(显示文本)。
如果#IF条件不满足,且有#ELSEACT和/或#ELSESAY,则执行它们。
示例:上面检测物品、结婚状态等的例子中已广泛使用。
CLOSE/@exit
功能:关闭当前的NPC对话框。
格式:CLOSE或写在按钮上<离开/@exit>
CHECKLEVELEX/CHECKLEVEL
功能:检测玩家的等级。
格式:
CHECKLEVELEX操作符(=><>=<=)等级值:常用,支持多种比较。
CHECKLEVEL等级值:检测玩家等级是否大于或等于指定值(有些版本支持)。
示例:
#IF
CHECKLEVELEX>34//检查玩家等级是否大于35级(因为通常35级才能带神兽)
#ACT
...(允许执行召唤神兽操作)
#ELSEACT
#SAY
你的等级还未达到35级,无法领悟召唤神兽的奥秘。\
<努力升级/@exit>
PARAM/GOTO
功能:传递参数或跳转。
PARAM:常用于向脚本标签传递参数(特别是玩家名)。
GOTO:强制跳转到指定的标签执行。
示例(传递玩家名):
[@main]
#SAY
请输入你想查看信息的玩家名字:\
<输入名字/@@InputPlayerName>
[@@InputPlayerName]
#ACT
MOVS1%INPUTSTR//将玩家输入的文字存入变量S1
GOTO@ShowPlayerInfo//跳转到@ShowPlayerInfo标签,并把S1变量值带过去
[@ShowPlayerInfo]
#IF
CHECKHUM%S1ONLINE//检测玩家%S1是否在线
...(显示该玩家信息)
综合示例NPC脚本
[@main]
SAY
欢迎光临【传奇装备店】,我是老板阿福!\
我可以为你提供以下服务:\
<购买高级装备/@buygood>\\//注意:这里是两个空格,表示更大的空行
<传送去练级圣地@levelup>\\\//三个空格,最大间距
<检测你的婚姻状况@checkmarry>\\
<召唤一只强力护卫@callbaby>\\
<离开@exit>
[@buygood]
SAY
年轻人,想买点好装备?看看这些:\
<屠龙刀/@buy_dragon>售价:8888金币(需有金条)\
<圣战手镯/@buy_hand>售价:5000金币\
<返回/@main>
[@buy_dragon]
IF
CHECKITEM金条1//检查是否有金条(可视为货币)
CHECKGOLD8888//检查是否有8888金币
ACT
TAKE金条1//收走1金条
TAKEGOLD8888//收走8888金币
GIVE屠龙刀1//给予屠龙刀
SAY
交易愉快!屠龙宝刀在手,天下你有!\
<返回/@buygood>
ELSEACT
SAY
很抱歉,你的金条或金币不足,无法购买屠龙刀。\
<返回/@buygood>
[@levelup]
ACT
MAPMOVEn113040//假设n11是"石墓阵"地图编号,传送到(3040)
SAY
已传送至石墓阵七层!祝你好运!(对话框会自动关闭)
[@checkmarry]
IF
CHECKMARRIED
SAY
看来你已经找到了心爱的另一半!祝福你!\
<返回/@main>
ELSESAY
单身狗也要快乐!缘分就在前方!\
<返回/@main>
[@callbaby]
IF
CHECKJOBWarrior//假设有检测职业的命令,不同引擎可能不同
CHECKLEVELEX>34//等级大于35级
ACT
RECALLMOB神兽7//召唤7级神兽
SAY
吼!神兽护驾!请小心战斗!\
<返回/@main>
ELSESAY
你看起来还需要更强一些才能驾驭如此强大的守护兽。\
(战士35级以上方可召唤)\
<返回/@main>
重要提示&注意事项
引擎差异:不同传奇引擎(HEROLEGENDBLUEGEE等)的命令语法和功能支持度会有差异。务必查阅你所用引擎的官方脚本说明书!本文以最常见的形式讲解核心概念和命令。
中文支持:命令本身(如GIVETAKECHECKITEM)通常是英文,但物品名、地图名、NPC对话文字可以是中文(需要引擎和客户端支持正确的文字编码,如GBK)。
大小写:大部分引擎的脚本命令是大小写不敏感的(即give等同于GIVE),但使用大写是良好的规范。
安全性:编写NPC脚本(尤其是涉及发放装备、金币、权限的)要特别注意逻辑严谨性,避免出现刷装备的漏洞!使用条件检测(#IF)严格把关。使用TAKE命令要谨慎,避免误删玩家重要物品。
变量:复杂脚本会使用变量存储信息(如MOVD1100存数字MOVS1"沙巴克"存字符串)。这属于进阶内容。
地图坐标:传送坐标务必准确。可以利用引擎提供的坐标查看工具确认地图上的可行走坐标点。
宝宝限制:RECALLMOB会受到职业、等级、技能、宝宝数量上限、地图能否召唤等多重限制。务必了解当前引擎的设置。
核心结构-NPC脚本的基本框架
一个典型的NPC脚本通常包含以下几个部分:
触发条件:玩家点击NPC后,脚本开始执行。通常以[@main]开始,后面可以跟其他标签如[@giveitem][@checkmarry]等。
显示文本:使用引号""包裹的文字,用于显示给玩家的对话信息。
脚本命令:实际执行操作的指令,以#IF#ACT#SAY#ELSEACT等关键字引导。
选项按钮:使用<>包裹的文字,供玩家点击触发后续脚本块(跳到其他标签)。
示例:最简单的问候脚本
[@main]
SAY
欢迎你,勇敢的冒险者!有什么需要帮忙的吗?\
<买东西/@buy><了解一下/@info><离开/@exit>
@main:脚本入口标签。
#SAY:后面的文字会显示在对话框里。\是换行符。
<>:玩家可以点击的按钮,点击后会跳转到对应的标签(如点击“买东西”会执行[@buy]段脚本)。
@exit:通常是一个关闭对话框的命令。
重要脚本命令详解
现在,让我们深入到你想了解的具体功能:
一、物品相关命令(给东西、收东西、检查物品)
GIVE/GIVEITEM
功能:给玩家物品。
格式:GIVE物品名数量
示例:
#IF
...(条件,例如检测任务完成)
#ACT
GIVE金条1//给玩家1个金条
GIVEITEM裁决之杖1//给玩家1把裁决之杖
TAKE
功能:收取玩家的物品。
格式:TAKE物品名数量
示例:
#IF
CHECKITEM金条1//条件:检查玩家是否拥有1个金条
#ACT
TAKE金条1//收取玩家1个金条
CHECKITEM/CHECKGOLD/CHECKITEMW
功能:检查玩家是否拥有指定物品或金钱。
格式:
CHECKITEM物品名数量:检查背包是否有指定数量的某物品。
CHECKGOLD数量:检查玩家金币是否大于或等于指定数量。
CHECKITEMW物品名数量:检查玩家身上是否穿着/装备着指定数量的某物品(如武器、衣服)。
示例:(常和#IF#ELSEACT配合使用)
#IF
CHECKITEM求婚戒指1
#ACT
#SAY
你带着象征爱情的求婚戒指!\
<求婚仪式/@marry>
#ELSEACT
#SAY
想要求婚?先准备好一枚求婚戒指吧!\
<离开/@exit>
二、检测关系状态命令(结婚、师徒)
CHECKMARRIED/CHECKMARRIAGE
功能:检测玩家是否已经结婚。
格式:CHECKMARRIED
常用参数(可能版本不同有差异):有时需要指定是检测自己的状态还是检测目标的状态。通常目标玩家(如配偶)名字可以通过变量传递。
示例(检测自己是否已婚):
#IF
CHECKMARRIED//检测当前点击NPC的玩家是否已婚
#ACT
#SAY
你已经有了相伴一生的爱人,祝福你们!\
<查看夫妻属性/@checkcouple>
#ELSEACT
#SAY
单身贵族?来参加我们的联谊活动吧!\
<报名相亲/@date>
CHECKMASTER/CHECKSLAVE/CHECKSLAVECOUNT
功能:检测玩家的师徒关系。
格式(常见):
CHECKMASTER:检查玩家是否有师父。
CHECKSLAVE:检查玩家是否有徒弟。
CHECKSLAVECOUNT:检查玩家当前有多少个徒弟(通常在检测收徒上限时使用)。
示例(检测是否有师父):
#IF
CHECKMASTER//检测当前玩家是否有师父
#ACT
#SAY
你已经有了一位指引你前进的师父了。\
<看望师父/@visitmaster>
#ELSEACT
#SAY
英雄之路,怎能少了名师指点?来寻找你的师父吧!\
<发布拜师信息/@findmaster>
三、传送命令(移动到指定地图/坐标)
MAP/MAPMOVE
功能:将玩家传送到指定的地图(默认坐标或指定坐标)。
格式:
MAP地图编号/地图名:传送到该地图的默认安全区坐标。
MAPMOVE地图编号/地图名X坐标Y坐标:精确传送到地图的指定坐标(XY)。
示例:
#ACT
MAP0//传送到盟重土城(假设0是土城的地图编号)
MAPMOVED7175050//传送到"魔龙城(D717)"地图的坐标(5050)
MAP沙巴克城//如果地图名是文本,需要引擎支持或配置文件中映射好
四、召唤宝宝命令(召唤宠物/神兽等)
RECALLMOB
功能:在玩家身边召唤一个指定的怪物作为宝宝。
格式:RECALLMOB怪物名宝宝等级(可选)持续时间(可选,单位秒)
重要参数:
怪物名:必须是引擎数据库(Monster.DB/Dbserver)里存在的怪物名称。
等级:(可选)召唤出的宝宝的等级。
时间:(可选)宝宝存在的时间(秒)。不填通常是永久(或直到被杀死/地图刷新)。
示例:
#ACT
RECALLMOB神兽//召唤一只名为"神兽"的永久宝宝
RECALLMOB月灵3300//召唤一只3级"月灵",5分钟后消失
注意事项:
玩家必须有召唤宝宝的技能(如召唤神兽)且达到技能要求等级(如果引擎有设定)。
引擎通常有宝宝数量上限(如RecallMobCountLimit)设置。
宝宝死亡或被刷掉后需要重新召唤。
五、其他常用基础命令
#IF/#ACT/#SAY/#ELSEACT/#ELSESAY
功能:脚本执行流程控制核心。
逻辑:
#IF:定义检测条件(如CHECKITEMCHECKMARRIED等)。
如果#IF条件满足,则执行后面的#ACT(执行动作命令)和/或#SAY(显示文本)。
如果#IF条件不满足,且有#ELSEACT和/或#ELSESAY,则执行它们。
示例:上面检测物品、结婚状态等的例子中已广泛使用。
CLOSE/@exit
功能:关闭当前的NPC对话框。
格式:CLOSE或写在按钮上<离开/@exit>
CHECKLEVELEX/CHECKLEVEL
功能:检测玩家的等级。
格式:
CHECKLEVELEX操作符(=><>=<=)等级值:常用,支持多种比较。
CHECKLEVEL等级值:检测玩家等级是否大于或等于指定值(有些版本支持)。
示例:
#IF
CHECKLEVELEX>34//检查玩家等级是否大于35级(因为通常35级才能带神兽)
#ACT
...(允许执行召唤神兽操作)
#ELSEACT
#SAY
你的等级还未达到35级,无法领悟召唤神兽的奥秘。\
<努力升级/@exit>
PARAM/GOTO
功能:传递参数或跳转。
PARAM:常用于向脚本标签传递参数(特别是玩家名)。
GOTO:强制跳转到指定的标签执行。
示例(传递玩家名):
[@main]
#SAY
请输入你想查看信息的玩家名字:\
<输入名字/@@InputPlayerName>
[@@InputPlayerName]
#ACT
MOVS1%INPUTSTR//将玩家输入的文字存入变量S1
GOTO@ShowPlayerInfo//跳转到@ShowPlayerInfo标签,并把S1变量值带过去
[@ShowPlayerInfo]
#IF
CHECKHUM%S1ONLINE//检测玩家%S1是否在线
...(显示该玩家信息)
综合示例NPC脚本
[@main]
SAY
欢迎光临【传奇装备店】,我是老板阿福!\
我可以为你提供以下服务:\
<购买高级装备/@buygood>\\//注意:这里是两个空格,表示更大的空行
<传送去练级圣地@levelup>\\\//三个空格,最大间距
<检测你的婚姻状况@checkmarry>\\
<召唤一只强力护卫@callbaby>\\
<离开@exit>
[@buygood]
SAY
年轻人,想买点好装备?看看这些:\
<屠龙刀/@buy_dragon>售价:8888金币(需有金条)\
<圣战手镯/@buy_hand>售价:5000金币\
<返回/@main>
[@buy_dragon]
IF
CHECKITEM金条1//检查是否有金条(可视为货币)
CHECKGOLD8888//检查是否有8888金币
ACT
TAKE金条1//收走1金条
TAKEGOLD8888//收走8888金币
GIVE屠龙刀1//给予屠龙刀
SAY
交易愉快!屠龙宝刀在手,天下你有!\
<返回/@buygood>
ELSEACT
SAY
很抱歉,你的金条或金币不足,无法购买屠龙刀。\
<返回/@buygood>
[@levelup]
ACT
MAPMOVEn113040//假设n11是"石墓阵"地图编号,传送到(3040)
SAY
已传送至石墓阵七层!祝你好运!(对话框会自动关闭)
[@checkmarry]
IF
CHECKMARRIED
SAY
看来你已经找到了心爱的另一半!祝福你!\
<返回/@main>
ELSESAY
单身狗也要快乐!缘分就在前方!\
<返回/@main>
[@callbaby]
IF
CHECKJOBWarrior//假设有检测职业的命令,不同引擎可能不同
CHECKLEVELEX>34//等级大于35级
ACT
RECALLMOB神兽7//召唤7级神兽
SAY
吼!神兽护驾!请小心战斗!\
<返回/@main>
ELSESAY
你看起来还需要更强一些才能驾驭如此强大的守护兽。\
(战士35级以上方可召唤)\
<返回/@main>
重要提示&注意事项
引擎差异:不同传奇引擎(HEROLEGENDBLUEGEE等)的命令语法和功能支持度会有差异。务必查阅你所用引擎的官方脚本说明书!本文以最常见的形式讲解核心概念和命令。
中文支持:命令本身(如GIVETAKECHECKITEM)通常是英文,但物品名、地图名、NPC对话文字可以是中文(需要引擎和客户端支持正确的文字编码,如GBK)。
大小写:大部分引擎的脚本命令是大小写不敏感的(即give等同于GIVE),但使用大写是良好的规范。
安全性:编写NPC脚本(尤其是涉及发放装备、金币、权限的)要特别注意逻辑严谨性,避免出现刷装备的漏洞!使用条件检测(#IF)严格把关。使用TAKE命令要谨慎,避免误删玩家重要物品。
变量:复杂脚本会使用变量存储信息(如MOVD1100存数字MOVS1"沙巴克"存字符串)。这属于进阶内容。
地图坐标:传送坐标务必准确。可以利用引擎提供的坐标查看工具确认地图上的可行走坐标点。
宝宝限制:RECALLMOB会受到职业、等级、技能、宝宝数量上限、地图能否召唤等多重限制。务必了解当前引擎的设置。

