当前位置: 首页 > news >正文

冒险岛(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对话基本函数

DecsBaseFunctiontypemodesection
-[弹出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 经验  

相关文章:

  • Web前端开发 - 制作简单的焦点图效果
  • 你通俗易懂的理解——线程、多线程与线程池
  • strlen和sizeof,const char *、char * const 和char []区别
  • Web安全与漏洞挖掘
  • 常见高危端口解析:网络安全中的“危险入口”
  • 网络安全-等级保护(等保) 3-1 GB/T 28448-2019 《信息安全技术 网络安全等级保护测评要求》-2019-05-10发布【现行】
  • 01-jenkins学习之旅-window-下载-安装
  • OceanBase数据库全面指南(基础入门篇)
  • Django的请求和响应+template模板
  • 软件设计师“设计原则”真题考点分析——求三连
  • 重排序模型计算两个文本的分数
  • VS Code中Maven未能正确读取`settings.xml`中配置的新路径
  • 超声仿真乳腺体模的主要声学参数
  • docker容器暴露端口的作用
  • Linux中 I/O 多路复用机制的边缘触发与水平触发
  • 基于ITcpServer/IHttpServer框架的HTTP服务器
  • 如何重新设置网络ip地址?全面解析多种方法
  • Python 数据分析基础
  • leetcode hot100刷题日记——9.矩阵置零
  • 【小乌龙问题】stm32供电,用过的ch340缺无法被识别
  • 查询网站域名备案/重庆森林经典台词梁朝伟
  • 网站的交互设计包括哪些/搜索风云榜
  • 网站开发后台 amp/网络营销学什么
  • 小说做任务赚钱的网站有哪些/下载百度导航最新版本
  • 上网站建设/游戏优化大师有用吗
  • 如何制作手机版网站/上海seo招聘