传奇脚本编写基础语法与实战方法

来源: 作者: 点击:
传奇脚本用于控制NPC对话、任务流程、物品发放、地图跳转等游戏逻辑,采用纯文本格式,依赖特定关键词和标签结构。以下以主流引擎(如Hero、AsmEdit)为例,说明脚本编写核心规则与常用模板。

一、脚本存放位置与命名规范
所有脚本文件必须置于服务端“QuestDiary”目录下,子目录按功能分类:
NPC对话脚本:放在“QuestDiaryNpc_def”;
任务触发脚本:放在“QuestDiaryMission”;
#call调用脚本:放在“QuestDiaryCall”;
全局事件脚本:主文件为“QFunction-0.txt”。
文件名需使用英文或数字,禁止空格与中文,扩展名为.txt。

二、基本结构:标签与指令
每个脚本由若干“标签段”组成,格式为[@标签名],后接执行命令。常见标签包括:
[@main]:脚本入口,玩家点击NPC时首先执行;
[@input]:处理玩家输入内容;
[@response_1]、[@response_2]:对应对话选项分支。
示例(简单对话):

[@main]
IF
ACT
SENDMSG 5 欢迎来到新手村!


三、条件判断:#IF 与 #SAY
使用#IF定义触发条件,配合#ACT执行动作,#ELSE处理反向逻辑。常用条件语句:
CHECKLEVEL > 30:角色等级大于30;
CHECKITEM 圣战戒指 1:背包含至少1个“圣战戒指”;
CHECKGOLD > 10000:金币超过一万;
CHECKMAP 3:当前位于地图编号3(如比奇城)。
示例(领取奖励):

[@main]
IF
CHECKITEM 新手礼包 1
ACT
TAKE 新手礼包 1
GIVE 火龙剑 1
SENDMSG 5 获得火龙剑!
ELSE
SENDMSG 5 请先获取新手礼包。


四、玩家交互:对话选项与输入框
通过#SAY显示多选项,用;分隔选项文本,自动关联@response_1等标签:

[@main]
SAY
请选择服务:
传送至盟重省;
领取每日奖励;
退出对话。

若需玩家手动输入(如兑换码),使用:

[@main]
ACT
MOVR D0 输入兑换码:
WAITING INPUT
[@input]
IF
EQUAL D0 VIP2024
ACT
GIVE 金币 50000
CLOSE


五、地图跳转与坐标传送
使用MAPMOVE指令实现传送,格式:MAPMOVE 地图名 X Y。地图名需与MapInfo.txt中定义一致。
示例:

[@response_1]
ACT
MAPMOVE M001 333 333

若需随机坐标,可结合RANDOM指令:

IF
RANDOM 3
ACT
MAPMOVE D001 100 100
ELSEACT
MAPMOVE D001 200 200


六、变量与临时存储
使用D0–D99存储临时数值或字符串,HUMAN用于读写角色属性。
MOV D0 100:将100赋值给D0;
INC D0 1:D0加1;
HUMAN[USER(HP)]:获取玩家当前血量。
示例(计数任务):

[@kill_monster]
IF
CHECKMONSTER 黑野猪
ACT
INC D1 1
SAVEVAR HUMAN KILL_COUNT D1
IF
LARGE D1 10
ACT
GIVE 勇者勋章 1
CLEARVAR HUMAN KILL_COUNT


七、定时与事件触发
在QFunction-0.txt中定义全局事件,如登录、死亡、升级:
[@Login]:玩家上线时触发;
[@Death]:角色死亡时执行;
[@LevelUp]:升级后运行。
示例(每日首次登录奖励):

[@Login]
IF
CHECKVAR HUMAN LAST_LOGIN_DATE DATE
ACT
GIVE 金条 1
MOV HUMAN LAST_LOGIN_DATE DATE


八、调试与排错
使用SENDMSG 0 “调试信息”向GM发送提示;
检查M2Server启动日志是否报“脚本语法错误”;
确保所有GIVE/TAKE物品名称与StdItems.txt完全一致;
避免无限循环(如[@main]内直接CALL @main)。

掌握上述规则后,可组合实现复杂任务链、副本入口、装备合成等功能。脚本无需编译,保存后重启服务端或执行@ReloadScript即可生效。