想学传奇服务端脚本,打开版本文件一看满篇的#IF、#ACT、give、take,不知道哪句管什么事。这事说白了就是没把命令分门别类理清楚。传奇脚本看着乱,其实翻来覆去就那么几类:流程控制的、检测判断的、执行功能的、操作变量的。今天按引擎通用标准,把服务端脚本里最常见的命令全拆开讲明白。
**一、脚本基础结构与流程控制命令**
任何脚本文件打开,最先看到的就是方括号和#号开头的玩意。这些是脚本的骨架,决定了对话怎么显示、逻辑往哪跳。
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| [@段名] | 定义一个脚本段,段名用英文或数字表示 | [@main] |
| goto @段名 | 跳转到指定段执行 | goto @buy |
| #say | 后面跟要显示的文字内容 | #say 你好啊冒险家 |
| #act | 后面跟要执行的命令 | #act give 金条 1 |
| #if | 条件判断的开始 | #if checklevel 50 |
| #elseact | 条件不成立时执行 | #elseact goto @main |
| #elsesay | 条件不成立时显示内容 | #elsesay 你等级不够 |
| break | 中断当前命令执行 | break |
| close | 关闭当前对话窗口 | close |
| #call | 调用QuestDiary文件夹下的子程序 | #call [\功能脚本\测试.txt] @段名 |
goto命令最常用,点某个选项就跳去执行对应的功能段。if和act配合是实现脚本逻辑的核心,if后面写条件,成立就走act,不成立走elseact。
**二、物品与金币操作命令**
NPC最基本的功能就是给东西、收东西,这些命令必须烂熟于心。
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| give 物品名 数量 | 给玩家指定物品 | give 裁决之杖 1 |
| take 物品名 数量 | 拿走玩家身上物品 | take 金条 5 |
| take 物品名 数量 是否检测装备改名 | 0或空:不检测,1:检测 | take 金条 5 1 |
| takeex 物品名1\|物品名2\|物品名3 D0 | 批量删除物品,回收总数量保存变量 | takeex 金条\|银元\|铜币 D0 |
| give gold 数量 | 给金币 | give gold 100000 |
| take gold 数量 | 扣金币 | take gold 5000 |
| takew 序列号 | 将背包里指定序列号的物品删除 | takew 123456 |
| takeb 装备位置 | 脱下指定位置装备放进背包 | takeb $weapon |
| takeb ALL | 脱下所有装备 | takeb ALL |
| takecheckitem | 收取前面用checkitem检测过的物品 | takecheckitem |
注意take和takew的区别,take只能回收背包里的,takew可以直接按序列号删物品。takeb用于脱装备,写ALL就是全身脱光。
**三、地图移动相关命令**
传送、刷怪、清怪都靠这批命令。
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| map 地图名 | 移动到指定地图随机坐标 | map 3 |
| mapmove 地图名 X Y | 移动到指定地图的精确坐标 | mapmove 0 330 330 |
| mapmove 地图名 X Y 范围 | 在指定坐标范围内随机移动 | mapmove 0150 50 5 10 |
| TimeRecall 分钟数 | 设置进入地图后的停留时间,超时传回 | TimeRecall 30 |
| BreakTimeRecall | 中断时间限制 | BreakTimeRecall |
| monclear 地图名 | 清空指定地图的所有怪物 | monclear 3 |
| Param1 地图名 | 刷怪命令第一参数:地图 | Param1 3 |
| Param2 横坐标 | 刷怪命令第二参数:横坐标 | Param2 150 |
| Param3 纵坐标 | 刷怪命令第三参数:纵坐标 | Param3 150 |
| MonGen 怪物名 数量 时间 | 配合上面三个参数刷怪 | MonGen 白野猪 1 60 |
| ExchangeMap 地图名 | 和指定地图里的人交换位置 | ExchangeMap 0150 |
mapmove后面不写坐标就是随机传送,写了坐标就是定点,再加个范围就是在那个点周围随机飘。TimeRecall常用于限制活动地图停留时间,时间到了自动传回。
**四、变量定义与运算命令**
脚本里要计数、要随机、要记录状态,离不开变量。不同引擎变量类型略有差异,下面列的是通用规则。
P0-P9:临时变量,只在当前NPC对话有效,关了对话框就清零。
D0-D9:私人变量,下线清零,在线时全局NPC通用。
N0-N999:整数变量,用法和P、D类似。
S0-S999:字符串变量,存文字用的。
G0-G999:全局变量,整个服务器通用,所有玩家共享。
A0-A999:全局字符串变量。
U0-U49:私人变量,数字型,可保存到人物数据库。
T0-T49:私人变量,字符型,可保存到人物数据库。
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| mov 变量 数值 | 给变量赋值 | mov N1 100 |
| inc 变量 数值 | 变量加指定数值 | inc N1 50 |
| dec 变量 数值 | 变量减指定数值 | dec N1 30 |
| mul 变量 数值 | 变量乘指定数值 | mul N1 2 |
| mul 变量 数值1 数值2 | 变量乘两数乘积 | mul N1 100 2 |
| div 变量 数值 | 变量整除指定数值 | div N1 5 |
| div 变量 数值1 数值2 | 变量乘两数商 | div N1 100 2 |
| movr 变量 数值 | 给变量赋0到数值之间的随机数 | movr N1 10 |
| movr 变量 最小值 最大值 | 给变量赋指定范围随机数 | movr P0 10 100 |
| random 数值 | 随机概率判断,数值几就是几分之一几率 | random 3 |
| <$STR(变量)> | 把变量的值显示出来 | #say 你的积分是<$STR(N1)> |
| small 变量 数值 | 检测变量是否小于指定数值 | small N1 100 |
| large 变量 数值 | 检测变量是否大于指定数值 | large N1 100 |
| equal 变量 数值 | 检测变量是否等于指定数值 | equal N1 100 |
sum命令用法有点绕,先要把结果变量清0,然后每写一行sum就加一个数进去。
```
MOV N0 0 ; 先把N0清0
sum N1 N2 ; N0 = N1 + N2
sum N3 ; N0 = N0 + N3 最终N0 = N1+N2+N3
```
**五、条件检测命令大全**
#if后面跟的检测命令,种类最多,挑常用的列出来。
**等级职业类:**
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| CHECKLEVELEX (>,<,=) 等级 | 检测人物等级 | CHECKLEVELEX > 50 |
| CHECKJOB 职业 | 检测职业,职业用Warr/Wizard/Taos | CHECKJOB Warr |
| CHECKEXP (>,<,=) 经验值 | 检测当前经验值 | CHECKEXP > 1000000 |
| CHECKGENDER 性别 | 检测性别,Man男 Woman女 | CHECKGENDER Man |
| CHECKCREDITPOINT (>,<,=) 数值 | 检测声望值 | CHECKCREDITPOINT > 200 |
**背包装备类:**
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| CHECKITEM 物品名 数量 | 检测背包里是否有指定数量物品 | CHECKITEM 疗伤药 5 |
| CHECKITEMW 物品名 | 检测身上是否佩戴指定物品 | CHECKITEMW 传送戒指 |
| CHECKGOLD 数量 | 检测金币是否大于等于指定数量 | CHECKGOLD 50000 |
| CHECKGAMEGOLD (>,<,=) 数量 | 检测元宝数量 | CHECKGAMEGOLD > 1000 |
| CHECKBAGGAGE | 检测背包是否已满 | CHECKBAGGAGE |
| CHECKBAGSIZE 空格数 | 检测背包空格数量是否达标 | CHECKBAGSIZE 5 |
| CHECKUSEITEM 位置 | 检测指定位置是否戴了东西 | CHECKUSEITEM 1 |
| CHECKITEMTYPE 物品位置 物品类型 | 检测指定位置物品类型 | CHECKITEMTYPE 1 2 |
| CHECKDURAEVA 物品名 数值 | 检测有品质的物品的品质 | CHECKDURAEVA 金矿 10 |
**人物状态类:**
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| CHECKPKPOINT (>,<,=) 数值 | 检测PK值 | CHECKPKPOINT > 100 |
| CHECKLUCKYPOINT (>,<,=) 数值 | 检测幸运值 | CHECKLUCKYPOINT > 5 |
| CHECKHP (>,<,=) 下限 (>,<,=) 上限 | 检测HP值范围 | CHECKHP < 300 > 100 |
| CHECKMP (>,<,=) 下限 (>,<,=) 上限 | 检测MP值范围 | CHECKMP < 200 > 50 |
| CHECKSLAVECOUNT (>,<,=) 数量 | 检测宝宝数量 | CHECKSLAVECOUNT > 3 |
| CHECKSLAVELEVEL (>,<,=) 等级 | 检测宝宝等级 | CHECKSLAVELEVEL > 5 |
| CHECKSKILL 技能名 (>,<,=) 等级 | 检测技能修炼等级 | CHECKSKILL 魔法盾 = 3 |
**地图人数类:**
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| CHECKHUM 地图名 (>,<,=) 数量 | 检测指定地图的人数 | CHECKHUM 3 < 10 |
| CHECKMON 地图名 (>,<,=) 数量 | 检测指定地图的怪物数量 | CHECKMON 3 > 50 |
| CHECKMONMAP 地图名 数量 | 检测指定地图的怪物数 | CHECKMONMAP 3 100 |
| CHECKRANGEMONCOUNT 地图号 X Y 范围 (>,<,=) 数量 | 检测坐标范围内怪物数 | CHECKRANGEMONCOUNT 3 150 150 10 > 5 |
**列表检测类:**
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| CHECKNAMELIST 文件名.txt | 检测名字是否在名单里 | CHECKNAMELIST 封号名单.txt |
| CHECKIPLIST 文件名.txt | 检测IP是否在名单里 | CHECKIPLIST 禁止IP.txt |
| CHECKACCOUNTLIST 文件名.txt | 检测账号是否在名单里 | CHECKACCOUNTLIST 会员账号.txt |
| CHECKGUILDLIST 文件名.txt | 检测行会是否在名单里 | CHECKGUILDLIST 攻城行会.txt |
| CHECKACCOUNTIPLIST 文件名.txt | 检测账号和IP是否匹配列表 | CHECKACCOUNTIPLIST 白名单.txt |
**其他常用检测:**
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| ISADMIN | 检测是否为管理员 | ISADMIN |
| HAVEGUILD | 检测是否有行会 | HAVEGUILD |
| ISCASTLEMASTER | 检测是否为沙城主 | ISCASTLEMASTER |
| ISGUILDMASTER | 检测是否为行会老大 | ISGUILDMASTER |
| ISNEWHUMAN | 检测是否为新人(首次登录) | ISNEWHUMAN |
| ONLINELONGMIN (>,<,=) 分钟 | 检测在线时长 | ONLINELONGMIN > 60 |
| ISLOCKPASSWORD | 检测仓库是否解锁 | ISLOCKPASSWORD |
**六、功能执行命令**
条件成立后,在#act或#elseact后面执行的叫功能命令。
**人物属性调整类:**
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| CHANGEEXP (+,-,=) 数值 | 调整经验值 | CHANGEEXP + 50000 |
| CHANGELEVEL (+,-,=) 等级 | 调整等级 | CHANGELEVEL + 1 |
| CHANGEPKPOINT (+,-,=) 点数 | 调整PK值 | CHANGEPKPOINT - 50 |
| GAMEGOLD (+,-,=) 数量 | 调整元宝 | GAMEGOLD + 1000 |
| CREDITPOINT (+,-,=) 数量 | 调整声望 | CREDITPOINT + 10 |
| CHANGENAMECOLOR 数值 | 改名字颜色 | CHANGENAMECOLOR 253 |
| HAIRSTYLE 数值 | 改发型 | HAIRSTYLE 2 |
| HAIRCOLOR 红值 绿值 蓝值 | 改头发颜色 | HAIRCOLOR 255 0 0 |
| HUMANHP + 数值 | 加血量 | HUMANHP + 500 |
| HUMANMP + 数值 | 加魔法值 | HUMANMP + 300 |
**技能类命令:**
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| ADDSKILL 技能名 等级 | 学习技能 | ADDSKILL 召唤神兽 3 |
| DELSKILL 技能名 | 删除技能 | DELSKILL 烈火剑法 |
| SKILLLEVEL 技能名 (=,+,-) 等级 | 调整技能等级 | SKILLLEVEL 冰咆哮 + 1 |
| DELNOJOBSKILL | 删除所有非本职业技能 | DELNOJOBSKILL |
**宝宝类命令:**
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| RECALLMOB 怪物名 宝宝等级 叛变分钟 变色 固定颜色 | 召唤宝宝 | RECALLMOB 神兽 7 60 0 |
| KILLSLAVE | 杀死所有宝宝 | KILLSLAVE |
| CHANGESLAVELEVEL (+,-,=) 等级 | 调整宝宝等级 | CHANGESLAVELEVEL + 1 |
**称号与行会类:**
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| SETRANKLEVELNAME %s称号 | 设置人物封号 | SETRANKLEVELNAME %s天下第一 |
| ADDGUILDLIST 文件名.txt | 将行会加入列表 | ADDGUILDLIST 攻城行会.txt |
| DELGUILDLIST 文件名.txt | 将行会移出列表 | DELGUILDLIST 攻城行会.txt |
| ADDNAMELIST 文件名.txt | 将名字加入列表 | ADDNAMELIST 会员名单.txt |
| DELNAMELIST 文件名.txt | 将名字移出列表 | DELNAMELIST 会员名单.txt |
**消息与服务器类:**
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| SENDMSG 信息类型 消息内容 | 发送公告,类型0全服1自己2身边3全服弹窗 | SENDMSG 0 恭喜%s获得屠龙 |
| CLEARMAPMON 地图名 | 清除地图内所有怪物 | CLEARMAPMON 3 |
| KICK | 将当前玩家踢下线 | KICK |
| KILL 数值 | 杀死当前玩家 | KILL 1 |
| REPAIRALL | 修理全身装备 | REPAIRALL |
| MESSAGEBOX 消息内容 | 弹出对话框提示 | MESSAGEBOX 你的元宝不足 |
**七、逻辑变量与开关命令**
很多版本用[n]这种逻辑变量记录任务状态。
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| SET [n] 1 | 设置逻辑变量为真 | SET [100] 1 |
| SET [n] 0 | 设置逻辑变量为假 | SET [100] 0 |
| CHECK [n] 1 | 检测逻辑变量是否为真 | CHECK [100] 1 |
| RESET [起始] 个数 | 将从起始开始的连续变量清零 | RESET [100] 7 |
reset命令等价于写七行SET [100] 0到SET [106] 0。
**八、系统常量与变量显示**
写脚本时经常需要显示一些动态内容,比如玩家名字、当前行会,这些用系统常量直接调。
| 常量 | 含义 |
|------|------|
| <$USERNAME> | 当前玩家名字 |
| <$LEVEL> | 当前玩家等级 |
| <$JOB> | 职业 |
| <$GENDER> | 性别 |
| <$PKPOINT> | PK值 |
| <$HP> | 当前血量 |
| <$MP> | 当前魔法值 |
| <$MAXHP> | 最大血量 |
| <$MAXMP> | 最大魔法值 |
| <$GOLDCOUNT> | 背包金币数 |
| <$GAMEGOLD> | 元宝数 |
| <$CREDITPOINT> | 声望值 |
| <$USERWEAPON> | 手里拿的武器名称 |
| <$OWNERGUILD> | 沙巴克行会名称 |
| <$LORD> | 沙城主名字 |
| <$CASTLEGOLD> | 沙巴克总金币 |
| <$DATETIME> | 当前服务器时间 |
| <$H.变量> | 英雄的变量 | <$H.HP> |
| <$STR(变量)> | 将变量转换为字符型 | <$STR(N1)> |
这些常量用在#say后面,可以直接把数值显示出来。比如写#say 尊敬的<$USERNAME>,你的等级是<$LEVEL>。
**九、NPC对话功能开关**
NPC脚本开头经常会看到%100、+40这种数字,这些是定义NPC功能类型的。
| 代码 | 功能 |
|------|------|
| %100 | 标准买卖价格(不加倍) |
| %200 | 双倍价格 |
| +0 | 买药水类 |
| +1 | 卖肉 |
| +3 | 买书 |
| +4 | 卖书 |
| +5 | 修武器/买武器 |
| +6 | 卖武器 |
| +10 | 买衣服 |
| +11 | 修衣服 |
| +15 | 头盔类 |
| +19 +20 +21 | 项链类 |
| +22 | 买戒指 |
| +23 | 卖戒指 |
| +24 | 买手镯 |
| +26 | 修手镯 |
| +40 | 买肉 |
| +42 | 卖药水 |
| +43 | 武器相关 |
这些代码写在脚本最开头,决定点开NPC后默认弹出什么功能界面。
**十、英雄相关命令**
带英雄的版本还有一套英雄专属命令。
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| H.命令 | 英雄执行命令 | H.CheckItemW 火龙之心 1 |
| H.GIVE 物品名 数量 | 给英雄物品 | H.GIVE 护身符 1 |
| H.TakeOn 物品名 位置 | 英雄穿戴装备 | H.TakeOn 火龙之心 9 |
| H.RepairAll | 修理英雄全身装备 | H.RepairAll |
| CHECKHEROONLINE | 检测英雄是否在线 | CHECKHEROONLINE |
**十一、组队相关命令**
| 命令 | 功能说明 | 示例 |
|------|----------|------|
| CHECKGROUPCOUNT (>,<,=) 数量 变量 | 检测组队人数,结果存变量 | CHECKGROUPCOUNT > 0 M2 |
| GROUPMAPMOVE 地图号 X Y 等级 @触发 | 全队传送 | GROUPMAPMOVE 3 150 150 11 @ENTER |
| ISGROUPMASTER | 检测是否为队长 | ISGROUPMASTER |
**十二、脚本符号使用规则**
写脚本还得搞懂几个符号的用法:
[] 方括号括起来的表示段标签,比如[@main]。
<> 尖括号括起来的表示可点击的选项,里面用/分隔显示文字和跳转段。比如<购买/@buy>,玩家点"购买"就跳去[@buy]段。
\ 反斜杠表示换行。
; 分号放行首表示这一行是注释,不执行。
空格 命令和参数之间通常用空格隔开。
/ 斜杠在选项里分隔显示文本和跳转目标。
写一个最简单的NPC对话例子:
```
[@main]
#say
欢迎光临我的小店。\
你可以进行以下操作:\
<购买药品/@buy>\
<修理装备/@repair>\
<没什么事/@exit>
[@buy]
#say
你需要买什么?\
<强效金疮药/@buy_hp>\
<强效魔法药/@buy_mp>
[@buy_hp]
#act
give 强效金疮药 5
#say
给你5瓶药。
```
这个例子里用到了段跳转、say显示、act执行命令,是最基础的脚本框架。想学传奇脚本,先把上面这些命令记熟,找个版本对着看,很快就能上手。

