冒险岛(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 经验  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值