冒险岛(MapleStory) 083脚本教程
一.脚本原理
本节不考虑引擎实现和服务端运行方式,仅讨论实际功能。
1.脚本执行方式
当点击NPC后,服务端会在scripts-zh-CN\npc或 scripts\npc文件夹中寻找相应的NPC去执行它。这里以明珠港巴士为例(1002000.js)。
如何知道NPC的ID呢?打开服务端resources的application.yml,找到USE_DEBUG,设定为true即可在点击NPC的时候在聊天框看到ID。
2.执行脚本基础框架
基本框架为 start + action。也是脚本执行必备的两个函数,其中,start只执行一次,action可以联想为持续不停的进行调用(并非严格意义上的持续调用,只是方便理解),当遇到dispose函数时结束循环,NPC对话结束并释放相关资源。有些小伙伴会反馈脚本执行后就卡住了,大多就是因为这个原因。
var status = -1;function start()
{//如果你的函数只需要一层对话,一个功能,那么start就能满足需求了。status = -1;action(1, 0, 0);
}function action(mode, type, selection)
{}
二.NPC对话基本函数
1.NPC对话基本函数
Decs | BaseFunction | type | mode | section |
---|---|---|---|---|
-[弹出Yes/No对话框] | sendYesNo(str) | 1 | 是=1,否=0,结束=-1 | |
-[弹出带有下一个的对话框] | sendNext(str) | 0 | 下一项=1,结束=-1 | |
-[弹出带有上一个的对话框] | sendPrev(str) | 0 | 上一项=0,结束=-1 | |
-[弹出带有确定的对话框] | sendOk(str) | 0 | 确定=1,结束=-1 | |
-[弹出上&下一个的对话框] | sendNextPrev(str) | 0 | 上一项=0,下一项=1,停止=-1 | |
-[弹出接受&拒绝的对话框] | sendAcceptDecline(str) | 12 | 接受=1,拒绝=0,结束=-1 | |
-[弹出带有选项(#L索引# xxx #l)的对话框] | sendSimple(str) | 4 | 选择=1,结束=0 | 选择的索引 |
-[弹出选择造型的对话框] | sendStyle(str,int styles[]) | 0 | 确定=1,取消=0,结束=-1 | 选择的索引 |
-[弹出输入数字的对话框] | sendGetNumber(str,int def, int min, int max) | 0 | 确定=1,结束=0 | 输入的数字 |
-[保存指定的字符串] | setGetText(str) | |||
-[弹出带有输入字符串的对话框] | sendGetText(str) | 0 | 确定=1,结束=0 | |
-[返回sendGetText(str)/setGetText(str)寫入的字符串] | getText() |
2.模拟训练
-修改明珠港NPC脚本,需求:点击NPC并输入数字获得指定的道具(&金币)。
var status;//Start
function start()
{status = -1;action(1, 0, 0);
}function action(mode, type, selection)
{if (CheckStatus(mode)){if (status == 0){//第一层对话cm.sendGetNumber("请输入数字,我可以刷任何道具",0,0,99999999);}else if (status == 1 ){//第二层对话if (cm.itemExists(selection)){cm.gainItem(selection,1);var text = "恭喜你,Get到了!" + "i" + selection + "#";cm.sendOk(text);cm.dispose(); }else{cm.sendOk("道具不存在!");cm.dispose(); }}else{//最后一层对话完继续循环至此,退出结束cm.dispose();}}}function CheckStatus(mode)
{if (mode == -1){cm.dispose();//点击了取消,停止,结束return false;}if (mode == 1){status++;}else{status--;}if (status == -1){cm.dispose();//防止第一层对话带有上一项或者取消按钮而产生bug。return false;} return true;
}
三.实操
-新增消耗栏道具执行脚本
tradeBlock =1;不可交换
slotMax =99; 最大堆放数量
price =出售价格
script=要调用的脚本名称,在item中,名字需要相符(但是实际是服务端xml去控制)
npc =呼唤哪个NPC进行脚本呢?
/**北斗脚本北斗之星-2430033---By hanmburger*/
var status = -1;
var text;function start()
{status = -1;action(1, 0, 0);
}function action(mode, type, selection)
{if (CheckStatus(mode)){if (status == 0){//第一层对话if (im.haveItem(2430033, 7)){im.gainMeso(1000000);im.sendOk("这是赏你的,拿去吧.");im.gainItem(2430033,-7);im.dispose();}else{im.sendOk("请搜集7本以后再使用吧.");im.dispose(); }}else{im.dispose();}}}function CheckStatus(mode)
{if (mode == -1){cm.dispose();return false;}if (mode == 1){status++;}else{status--;}if (status == -1){cm.dispose();return false;} return true;
}
附录1-脚本框架分享
var status;//Start
function start()
{status = -1;action(1, 0, 0);
}function action(mode, type, selection)
{if (CheckStatus(mode)){if (status == 0){//第一层对话}else if (status == 1 ){//第二层对话}else{//最后一层对话完继续循环至此,退出结束cm.dispose();}}}function CheckStatus(mode)
{if (mode == -1){cm.dispose();//点击了取消,停止,结束return false;}if (mode == 1){status++;}else{status--;}if (status == -1){cm.dispose();//防止第一层对话带有上一项或者取消按钮而产生bug。return false;} return true;
}
附录2-常见的NPC脚本标记符
#b = 蓝色
说明: #b后面的字符串都用蓝色显示,用于你想要突出展示的字符串
示例: 这颗 #b珠子#k 是进入扎昆副本的关键 #r = 红色
说明: #r后面的字符串都用红色显示,用于你想要突出展示的字符串
示例: 这颗 #r珠子#k 是进入扎昆副本的关键 #d = 紫色
说明: #d后面的字符串都用紫色显示,用于你想要突出展示的字符串
示例: 这颗 #d珠子#k 是进入扎昆副本的关键 #g = 绿色
说明: #g后面的字符串都用绿色显示,用于你想要突出展示的字符串
示例: 这颗 #g珠子#k 是进入扎昆副本的关键 #k = 黑色
说明: 默认的字体就是黑色,所以#k常常用于把字体从其他颜色恢复成黑色
示例: 这颗 #g珠子#k 是进入扎昆副本的关键 #e = 加粗
说明: #e后面的字符串都用加粗显示,用于你想要突出展示的字符串
示例: 这颗 #e珠子#n 是进入扎昆副本的关键 #n = 常规
说明: #n把加粗或斜体转换成常规格式
示例: 这颗 #e珠子#n 是进入扎昆副本的关键 #h # = 玩家名称
说明: 用于展示玩家的名称
示例: 准备好了吗 #h # ,我会把你传送到射手村 #L[数字]# = 选项开始
说明: 数字从0开始依次往下+1
示例: 选择一个职业进行转职: \r\n #L[0]# 冰雷 #l \r\n #L[1]# 火毒 #l \r\n #L[2]# 牧师 #l #l = 选项结束
说明: 对应选项开始
示例: 选择一个职业进行转职: \r\n #L[0]# 冰雷 #l \r\n #L[1]# 火毒 #l \r\n #L[2]# 牧师 #l #o[怪物id]# = 怪物名称
说明: 用于展示怪物的名称
示例: 打败 #o[怪物id]# 10只后,再来与我对话 #m[地图id]# = 地图名称
说明: 用于展示地图的名称
示例: 去 #m[地图id]# 找到转职教官进行转职 #p[npcid]# = npc名称
说明: 用于展示npc的名称
示例: 我爹是 #p[npcid]# #q[技能id]# = 技能名称
说明: 用于展示技能的名称
示例: 技能 #q[技能id]# 能够对怪物造成强大的群伤效果 #s[技能id]# = 技能图片
说明: 用于展示技能的图片
示例: 技能 #s[技能id]# 能够对怪物造成强大的群伤效果 #c[物品id]# = 物品数量
说明: 用于展示这个物品在你的背包有多少个
示例: 我需要10个 #t[物品id]#,你的背包只有 #c[物品id]# 个 #t[物品id]# = 物品名称
#z[物品id]# = 物品名称
说明: 用于展示一个物品id对应的名称
示例: 我需要10个 #t[物品id]#,你的背包只有 #c[物品id]# 个 #i[物品id]# = 物品图片
#v[物品id]# = 物品图片
说明: 用于展示一个物品id对应的图片
示例: 你获得了 #i[物品id]# * 1 \r\n #v[物品id]# * 3 #B[%]# = 进度条
说明: 用于展示一个进度条
示例: 当前任务进展: #B[%]# #f[文件路径]# = 引用文件
#F[文件路径]# = 引用文件
说明: 从客户端的wz下取出资源文件展示
示例: 你获得了 #fUI/UIWindow.img/QuestIcon/4/0# \r\n #v[物品id]# 3 #t[物品id]# \r\n #FUI/UIWindow.img/QuestIcon/8/0# 10 经验 \r\n = 换行
说明: 在信息的末尾加一个\r\n,后面的信息会换一行展示
示例: 你获得了 #fUI/UIWindow.img/QuestIcon/4/0# \r\n #v[物品id]# 3 #t[物品id]# \r\n #FUI/UIWindow.img/QuestIcon/8/0# 10 经验