传奇脚本命令讲解从基础语法到变量与实战应用

来源: 作者: 点击:
传奇脚本的本质是事件驱动的文本指令集,引擎读取脚本文件中的标签、条件和执行命令,在玩家触发NPC对话、使用物品、击杀怪物等事件时按顺序运行。脚本文件存放在服务端Envir目录下,NPC脚本在Market_Def文件夹,任务脚本在QuestDiary文件夹,全局事件触发集中在QFunction-0.txt,登录脚本在QManage.txt。不同引擎在命令命名和参数格式上存在差异,但核心逻辑相通,掌握一套命令体系后迁移到其他引擎只需要替换少量命令名。

基础语法结构与执行逻辑

脚本由标签、条件段和执行段三部分组成。标签以@开头标识脚本段落,例如[@Main]是NPC对话的主入口。条件段用#IF开头,后面跟检测命令,满足条件时执行#ACT段的命令。不满足条件时如果有#ELSEACT段则执行该段,没有则跳过整个脚本段。

#IF和#ACT必须成对出现,且#IF在前#ACT在后。引擎从上往下逐行读取脚本,检测命令必须写在执行命令之前,否则条件判断失去意义。一个完整的脚本段结构如下:

[@Main]
#IF
CHECKITEM 金条 1
#ACT
TAKE 金条 1
GIVE 金币 1000000
#ELSEACT
MESSAGEBOX 需要1根金条才能兑换

BREAK命令用于终止当前脚本段的执行,防止脚本继续向下运行到无关段落。GOTO命令用于跳转到指定标签,格式为GOTO @标签名。CALL命令用于调用外部脚本文件中的子程序,格式为#CALL [文件路径] @函数名。

对话与交互命令

NPC对话是脚本最基础的功能。@Say命令向玩家显示对话文字,支持换行符\n。@Option命令显示可点击的选项按钮,点击后跳转到指定标签,如果不加跳转标签则关闭对话。@Close强制关闭对话窗口。@SendMsg向玩家发送系统提示,颜色码1为白色、2为绿色、3为红色、4为黄色。

@SendCenterMsg在屏幕中央显示全服可见的提示信息,需要指定颜色码、文字内容和持续时间。例如@SendCenterMsg 4 双倍经验活动开启 60表示在屏幕中央显示红色文字的双倍经验活动提示,持续60秒。

物品操作命令

GIVE给予玩家物品,格式为GIVE 物品名 数量。TAKE从玩家背包删除指定物品,格式为TAKE 物品名 数量,物品不足时执行失败。CHECKITEM检测玩家背包是否拥有指定数量的物品,用在#IF条件段中。CHECKITEMW检测玩家是否穿戴了指定装备,与CHECKITEM的区别在于前者检测背包,后者检测装备栏。

CHANGEITEM修改物品属性,格式为CHANGEITEM 物品名 属性 数值。MAKE制作物品。@GemUp装备强化命令,语法为@GemUp 装备位置 宝石数量 [成功率],装备位置0为武器、1为头盔、2为项链,以此类推。

货币与角色属性检测

CHECKGAMEGOLD检测元宝数量,CHECKGAMEPOINT检测游戏点数量,CHECKGOLD检测金币数量。这三个命令用在#IF段中做条件判断,命令后直接跟数量或比较运算符。

CHECKLEVEL检测等级,支持大于小于等于比较,例如CHECKLEVEL > 50检测等级是否大于50级。CHECKJOB检测职业,参数为Warrior、Wizard或Taos分别对应战士、法师、道士。CHECKHP检测血量百分比,例如CHECKHP < 30检测血量是否低于30%。CHECKPKPOINT检测PK值,CHECKEXP检测经验值。

变量操作命令

变量是脚本中存储数据的基本单位。MOV命令给变量赋值,格式为MOV 变量名 数值。INC命令让变量自增指定数值,DEC命令让变量自减。CALCVAR命令执行数学运算,支持加减乘除,格式为CALCVAR 变量名 + 数值。

变量在脚本中的引用方式为<$STR(变量名)>,在提示信息和对话文字中可以直接嵌入。例如MESSAGEBOX 当前元宝数量:<$STR(P0)>会将变量P0的值显示在提示框中。

传奇脚本的变量按作用范围和生命周期分为多种类型。P系列变量(P0-P999)是私人数字型变量,只在当前对话NPC内有效,关闭对话框后重置为0。D系列变量(D0-D999)是私人数字型变量,在人物不下线时对全局NPC通用传递,下线后清空。M系列变量(M0-M999)是私人数字型变量,下线不保存,切换地图清空。N系列变量(N0-N999)是私人数字型变量,下线不保存,小退归零。S系列变量(S0-S99)是私人字符型变量,可以存储文本内容。G系列变量(G0-G499)是全局变量,所有玩家共享,保存在GlobalVal.ini文件中,服务器重启后仍然保留。

变量选用的基本原则是:临时计算用P或D变量,跨NPC传递用M变量,需要保存玩家数据用U变量或G变量。自定义变量命名时不要以P、D、M、N、S、I、G、A开头,以免与引擎内置变量冲突。

流程控制与循环

GOTO跳转到指定标签,BREAK终止当前脚本执行。LOOP命令实现循环,格式为LOOP 次数,循环体中的命令会重复执行指定次数。循环次数必须设定上限,否则可能造成死循环导致引擎卡死。

WHILE和END配合实现条件循环,WAIT命令让脚本等待指定毫秒数后继续执行,DELAY命令延迟执行。GETTIME获取当前时间的小时、分钟、秒数,CHECKTIME检测当前时间是否在指定范围内,TIMER设定定时器在指定时间触发某个标签。

消息提示命令

SENDMSG发送消息,颜色码0为全服广播、1为个人消息、2为当前地图消息。TIP在屏幕提示区域显示文字。TOPMSG在顶部显示滚动消息。CENTERMSG在屏幕中央显示消息。SYSTEMMSG发送系统消息。CHATMSG发送聊天消息。这些命令的适用场景不同,全服活动通知用SENDMSG 0,个人操作反馈用SENDMSG 1,地图内提示用SENDMSG 2。

GOM与GEE引擎命令差异

GOM和GEE是国内使用最广泛的两款引擎,命令命名风格有明显差异。GOM多用CHANGE、ADD、DEL等动词前缀,GEE倾向使用SET、CREATE、REMOVE。玩家传送命令GOM为MAPMOVE,GEE为MOVETOMAP,参数顺序完全一致。属性修改命令GOM为CHANGEUSERATTR,GEE为SETUSERVALUE。刷怪命令GOM为MONSTER,GEE为SPAWNMONSTER,参数格式相同。

Buff状态命令的差异更明显。GOM使用ADDSTATE添加状态,GEE使用SETBUFF,且GEE多了一个显示类型参数,0为隐藏1为显示。清除状态GOM用CLEARSTATE,GEE用REMOVEBUFF。

GOM转GEE时,刷怪命令MONGENEX的参数顺序也有变化。GOM的参数顺序是地图名称、坐标X、坐标Y、怪物名称、范围、是否内功怪物、名称颜色,GEE的参数顺序是地图名称、坐标X、坐标Y、怪物名称、范围、数量、名称颜色、是否内功怪物,范围参数在GEE中表示数量而GOM中另有数量参数。转换脚本时需要逐条核对命令名和参数顺序,不能只改命令名不改参数。

脚本调试与常见错误

调试脚本时开启M2Server的调试模式查看执行日志,用SENDMSG输出变量值确认数据是否正确。分段测试脚本功能,先测试条件检测是否通过,再测试执行命令是否生效。

常见错误包括标签重复导致跳转错误,变量未初始化导致计算异常,循环无退出条件导致死循环。变量未初始化是新手最常遇到的问题,P变量和D变量在关闭对话框或下线后会清空,再次使用前必须重新赋值。另一个高频错误是物品名称与数据库不一致,脚本中的物品名必须与StdItems.DB中的完全一致,包括空格和标点,名称写错脚本不会报错但功能不触发。

脚本文件必须用ANSI编码保存,UTF-8编码会导致中文字符乱码进而使整个脚本加载失败。修改完成后在M2控制台执行重载脚本命令,或重启M2让配置生效。