> 神唱K歌 > 【脚本学习】包房欢迎脚本

【脚本学习】包房欢迎脚本

听说有同学想要个进入包房自动欢迎的脚本,如下:
MyTable =
{
EntryInfo= { ONLOADED,"state1"};
StateList = {"state1"};
state1 =
{
Timer = 2000,--每两秒执行一次OnTimer函数
TimeOut = -1,
NextState = "nil",
EventList= {};
};
}

function MyTable.state1.OnEnter(args)
data={}--定义数组,下文用于储存上次扫描到的角色id
datas={}--定义数组,下文用于储存当次扫描到的角色id
end

function MyTable.state1.OnTimer(args)
datas={}--清空datas
datavalue=uConcat(data,"#");--用“#”连接数组中的所有元素,并转换成字符串
local ret = uScanRet(1,20);--扫描并返回所有角色的ID至字符串ret。
s = uLen(ret)/15;--扫描到了s个角色,uLen()意为计算字符串的长度
for m=1,s do
datas[m]=uSub(ret,((m-1)*15+1),m*15)--将字符串中的ID写入数组datas
local g,h = uGsub(datavalue,datas[m],datas[m]);--验存,与上一次扫描结果比较。
if h==0 then--不存在则
uSendMsgBoxNine(datas[m],"欢迎光临XXX包房。");--紫色字体请换上自己喜欢的欢迎语言。
end
end
data=datas--将数组datas赋给数组data
end

function MyTable.state1.OnExit(args)
end

这个脚本放在MYHOME里同样能用,不过当MYHOME清洁度不够的时候房主失去房间的摆放权限,欢迎语就说不出来了。

脚本思路讲解:
实现这个功能需要做的事:
1.脚本每隔几秒对包房进行一次扫描。
我们有用于扫描的API:uScanRet(1,数量); 但是如何让它每隔几秒执行一次呢?
uWorld脚本中有专用的结构来控制,如下:
state1 =
{
Timer = 2000,--每两秒执行一次OnTimer函数
。。。。。。
};

意思是每两秒钟执行一次后文的function MyTable.state1.OnTimer(args)函数,函数中写上我们想要做的事情就行,比如扫描。
2.我们不可能每2秒就给扫描到的每一个人发送欢迎语言,那么怎么判断谁是新来的?
本脚本采用的方法是,将本次扫描到的人与上次(2秒前)进行比较,
不同的就是新来的,发送欢迎消息。
在脚本中则是,将两次扫描的结果放入两个不同的数组,然后用一个for循环将数组中的每一个元素与另一个数组进行比较,若全部不同,则发送信息。
3.脚本中还涉及到一些数组与字符串之间的转换。
主要是因为各API的返回值类型各有不同,具体见后面的API介绍。

其中用到的关键API介绍如下
函数:将数组连接起来,并且在中间以特定元素隔开
uConcat(table,sep,i,j);
参数:
(1)table:原数组
(2)sep:一个特定元素,可以使字符串或者数值
(3)i:table中的起始位置
(4)j:table中的结束位置
返回值:
转换以后的字符串,为字符串型
备注:
如sep不填,则默认为空字符串,若i不填,则默认为起始位置,若j不填,则默认为结束位置。特别是如果希望规定i的值,必须在sep位置添加空变量;同样,若希望规定参数j,则必须要在前面填sep和i的值


函数:扫描tile(192*192)内指定类别指定个数的对象,并在字符串中返回id
uScanRet(groupType,num);
参数:
(1) groupType:整型,要扫描对象的类型。1为人,4为物体。
(2) num:整型,返回的id数量。
返回值:
按扫描到的指定对象顺序记录“num”个对象id,并返回所有id的字符串。

函数:读取字符串中的指定位置
uSub(s,i,j);
参数:
(1)s:需要读取的原字符串
(2)i:读取的开始位置
(3)j:读取的结束位置
返回值:
读取出来的字符串

函数:字符串局部替换
uGsub(s,pattern,relp,n);
参数:
(1)s:原字符串
(2)pattern:指定一个段字符,所有s中出现的该部分将被替换v (3)relp:一串新的字符串,将用它来替换pattern
(4)n:替换次数,若不填,默认为全部替换
返回值:
替换完成后的新字符串。同时,返回替换的次数。
备注:
s可能是一个字符串,一个表,或函数。同时,返回替换的次数。
Eg:
(1)s = uGsub("lua is cute","cute","great");
--s为lua is great
(2)s,a = uGsub("all lii","l","x","2");
--s为axx lii,a为2