传奇服务端商业脚本并不是在客户端运行,全部依托服务端引擎进行解析执行,客户端只负责展示画面、接收指令,不参与脚本逻辑运算。不同引擎目录结构略有差异,脚本的运行载体分为M2主引擎、定时器、地图触发器、NPC事件、怪物事件、人物事件几大类,下面按存储路径、运行载体、触发方式完整说明。
M2引擎是绝大多数商业版本脚本的核心运行程序,也就是服务端目录里的M2Server.exe,所有脚本都会被M2读取并解析。M2启动的时候,会自动加载对应目录下的脚本文件,加载成功之后,脚本逻辑常驻内存,等待触发条件。引擎支持的脚本类型包含NPC对话脚本、地图触发脚本、人物登录脚本、怪物AI脚本、物品拾取脚本、技能触发脚本。修改脚本之后,不需要重启整套服务端,多数情况下可以使用M2面板里的重载脚本命令,快速加载新代码,部分底层事件脚本改动,需要重启M2才能生效。
NPC对话脚本,存放路径一般为Mir200\Envir\Market_Def,这一类脚本由M2引擎加载,在玩家点击NPC的时候触发运行。每一个NPC单独对应一个文本文件,文件名和NPC编号保持对应。玩家靠近NPC点击对话,M2读取对应的def脚本,逐行执行里面的对话跳转、变量赋值、物品扣除、给予奖励、传送地图等逻辑。脚本只在当前玩家交互的瞬间执行,执行完成就结束,不会持续后台运行,除非脚本内部开启循环逻辑。
地图触发脚本,目录位置Mir200\Envir\MapQuest_def,配套MapQuest.txt文件用来绑定地图编号与脚本文件。这类脚本在玩家进入地图、离开地图、在地图走动、击杀地图怪物时触发,由M2实时监测地图事件,满足条件就运行脚本。常见用途有地图进入检测、地图限时、地图刷怪控制、地图内属性增减、传送限制。脚本运行时机和玩家动作绑定,多名玩家在同一张地图,会各自独立触发脚本,互不干扰。
怪物脚本与怪物AI脚本,存放目录Mir200\Envir\MonGen是怪物刷新配置,怪物行为脚本大多在MonScript文件夹。怪物出生、攻击、死亡、血量变化时触发脚本,由M2引擎在怪物事件线程运行。怪物死亡掉落奖励、死亡传送、怪物喊话、怪物召唤小怪,都写在怪物脚本内。怪物脚本是后台持续监听类型,怪物存活期间,满足条件就会执行对应代码。
全局事件脚本,目录Mir200\Envir\QuestDiary,商业版本大量任务、登录检测、下线清理、活动定时脚本都放在这个文件夹。QuestDiary内可以新建子文件夹分类管理脚本,在QuestDiary.txt注册文件路径。这类脚本包含人物登录触发、人物下线触发、等级提升触发、拾取物品触发。只要对应事件发生,M2就会调用脚本执行,属于事件驱动运行模式。
定时器脚本,同样放置在QuestDiary目录,在注册文件设置定时执行周期,由M2后台线程按照设定时间自动运行,不需要玩家操作触发。沙巴克结算、定时刷BOSS、定时活动、定时清理变量,全部依靠定时器脚本运行。定时器脚本独立循环执行,是最容易出现死循环的一类脚本,一旦逻辑出错,会持续占用引擎资源。
英雄相关脚本,多数放在QuestDiary英雄子目录,部分引擎会单独划分HeroDef文件夹。英雄召唤、英雄死亡、英雄技能触发、英雄合击释放,都会触发对应脚本,由M2统一调度运行。英雄脚本和主号脚本分开执行,但是共享引擎变量池,编写时需要区分主号变量和英雄变量,避免变量冲突。
物品触发脚本,配置在物品数据库,绑定对应的脚本标签,脚本本体一般写在QuestDiary。当玩家拾取、双击、穿戴、丢弃指定物品时,M2识别物品标签,自动调用绑定脚本运行。例如双击使用道具、穿戴装备触发属性、装备掉落检测,都使用物品触发脚本。
脚本加载顺序,启动服务端时,先启动DB数据库,再启动LoginGate、GameGate网关,最后启动M2。M2启动过程中,依次读取Envir目录下各类注册文件,加载全部脚本到内存。脚本文件修改保存之后,在M2管理面板找到重载脚本选项,执行重载,引擎会重新读取磁盘上的脚本文件替换内存旧脚本。重载操作不会重置已经存在的人物变量,全局标记变量会保留,想要清空变量需要单独执行清理命令。
区分脚本运行环境,客户端不能运行任何商业逻辑脚本,客户端文件只包含界面、特效、文字显示。很多新手会混淆,把脚本写到客户端,修改之后不会产生任何业务效果。所有判断、扣物品、加属性、传送、刷怪、奖励发放这类逻辑,全部在服务端M2引擎内部执行,客户端只接收M2下发的结果,展示给玩家。
不同引擎路径会有细微差别,GOM引擎会把部分增强脚本放在Mir200\Envir\Script文件夹,GEE引擎支持内置脚本插件,HERO引擎QuestDiary目录结构更加简洁。不管目录名称变化,脚本运行载体依旧是M2主程序。使用插件扩展脚本功能时,插件作为M2的附属模块,脚本依旧由M2调度触发。
脚本运行调试,打开M2日志输出,开启脚本调试日志,脚本执行过程中的变量、命令、报错信息都会打印在日志窗口。可以在脚本内添加日志输出命令,查看脚本是否成功触发、变量数值是否正常。调试商业脚本优先在单机环境启动服务端,观察M2日志,确认脚本触发正常之后再投入使用。
商业脚本部署需要注意权限,脚本文件保存编码一般选择ANSI格式,使用UTF-8编码容易出现中文乱码,导致脚本加载失败,出现不触发、命令失效问题。文件命名不要使用中文特殊符号,注册文件内路径书写错误,会造成脚本无法加载,事件无法触发。修改脚本后优先重载,重载报错查看M2提示,定位文件和行数,修复语法错误。
整套逻辑里,M2是唯一的脚本运行核心,各类脚本文件只是存储代码的文本载体。脚本不会自己运行,依靠引擎监听游戏事件,事件匹配成功,才会读取代码执行。定时器脚本是唯一脱离玩家动作,后台周期性自动运行的脚本类型,其余脚本全部依靠玩家、怪物、地图事件触发。

