作者hmml (hmml)
看板mud_sanc
标题[心得] MUSHclient向全视窗或指定视窗送出命令的做法
时间Tue Apr 23 01:38:10 2013
这是一个对我而言蛮有用的功能,所以很早就在找怎麽
写这个功能了,它相当於zMUD的"ID:指令"或#all,#all是向
全部视窗发布命令。'
ID:指令'其实是切换视窗,送命令只是
顺便而已。
在MushClient里,它需要这个函数:
GetWorld (视窗名称):用来取得指定视窗的位址。
当然,也可以用这个:
GetWorldById(视窗ID):用法同上,只是你要取得
视窗的ID值有点麻烦,当视窗名称撞名的时候,才
可能采用它,谁那麽无聊,不同角色的视窗都用同
一个名字呢?
写法如下:
1. 决定别名的写法,记得点选正规表示法项目:
^to
(\S+) (.*)$
以to为起头,蓝色部份为%1,代表角色的ID(假设
视窗名设得跟游戏中的角色ID相同),黄色部份为%2
,用来输入指令。蓝色部份和黄色部份中间空一格。
注意大小写,不管是正规表示法还是Lua,都很明确细
份大小写,A 不等同 a,And and aNd 虽然只差大小
写,但三者都不一样。
2. 将GetWorld的内容指定到一个变数里:
toName = GetWorld(%1)
3. 再用toName去接发送的指令行:
toName:Send('%2')
基本上,这样就完成了,如果你正在玩弄kimokimo
走不开,想对aiggkimd下个recall的指令,就这麽输入
:
toaiggkimd recall
这样,aiggkimd就会recall了。
4. Send()是用来对MUD送命令的,如果只是想显示个讯
息,就要用:
toName:Note('%2')
5. 另外还有:
toName:Execute('%2')
如果你送的命令是MushClient的alias,只有这个才
能展开它。
6. 瑞士小刀:
toName:DoAfterSpecial(0.1,'%2',12)
其实它相当於zMUD的#alarm +Sec {commands},
不过它是我目前找到唯一能把指令送给脚本分析器
再分析内容的函数,所以它能吃内含函数的指令,
改动第三个参数的值,可以决定把内容送去哪里:
0:游戏
1:命令
2:输出窗口
3:状态栏
4:记事本(新建)
5:记事本(追加)
6:记录文件
7:记事本(替换)
8:命令队列
9:变数
10:执行(等同於在命令窗口输入命令)
11:快速行走(把发送内容解析为快速行走路径)
12:脚本(发送给脚本解析器来执行脚本命令)
13:立即发送(在命令队列执行之前就发送给游戏)
用途广泛,0相当於Send,2相当於Note,10相当於Execute,
12可以执行程式码,先记这几个就行了。第一个参数可以设
定几秒後执行,从0.1秒到23时59分59秒之间都可以。所以,
用它必然要接受至少0.1秒的延时输出,应该还能接受吧!
当使用它以脚本分析来对其它视窗输出指令时,如:
toName:DoAfterSpecial(0.1,'Send('save')',12)
就格式而言没什麽问题,不过,它会出错,要改成:
toName:DoAfterSpecial(0.1,'Send(
[[save
]])',12)
才会正常,其它函数也一样!这个就是重点,因为我常常忘
记,所以写这篇的啦!找出这个解法花一个小时,然後下次
再用,又花一个小时想发生什麽事...Orz
7. GetWorldById() 赢过 GetWorld() 的地方,就是它不用将
内容存到变数就能直接引用,虽然我没用过,不过,
http://mc.chinaido.com/help.php?function=GetWorldById
它范例是直接引用。
8. #all 的功能就是这个指令再加强,使用for回圈去完成它:
for key, value in pairs (GetWorldList()) do
toName = GetWorld (value)
toName: DoAfterSpecial(0.1,'%2',12)
end --for
这里,多了一个新同伴:
GetWorldList(),这函数应该是一
个表,内容是全部正打开的视窗的名字和位址。key就是名字
,value就是位址。透过for回圈把全部内容呼叫一次。
红色部份是固定格式不能改动;
黄色部份是你要它做什麽事;
蓝色部份是资料表的名称,可能是内建的函数,也可能是你提
供的able。绿色部份,你可以自行决定它的名字,判断它功能
的依据是位置不是名字,不要用什麽:
for、if、break、end...这样的名字就好了。
重点是不要让自己用起来很麻烦。
※ 这里只是写机的碎碎念,算是除错的小小提示:
a.
Lua 只要会用:
if...then...else...end
for...do...end
tablename = {a,b,c,d,e...}
就能写很多东西了。剩下的时间就是抓虫,这个比写的时间还多。
第6点讲的那个只是其中之一。模式大概就是:
tablename = {a,b,c,d,e....} --资料表
if '%1' == 'string' then --if判断
for key,value in pairs(tablename) do --进入回圈去翻资料
Note(key,' = ',value) --要干什麽事自已写,这只是例子
end --封闭for回圈
else --否则要怎样,这不一定要有
Note('string') --要干什麽事自已写,这只是例子
end --封闭if判断
或着:
tablename = {a,b,c,d,e....} --资料表
for key,value in pairs(tablename) do --进入回圈去翻资料
if value == 'string' then --if判断,翻到时要干什麽
Note ('Answer:',key) --要干什麽事自已写,这只是例子
break --跳出这个for回圈,如果要找到底就免了
end --封闭if判断
end --封闭for回圈
这两种套路,可以写好大部份的触发。
b. 还有一例:
if a < b then
Note('it is true!')
else
Note('it is false!')
end
这个写在MushClient内建的写机功能是正常的;不过,写在Plugin
里会出错,因为这个:
<script
>,它把a < b 当作你要宣告一个标
签...这个太----难抓了吧!不是很玩弄人吗?
if a == 1 then
Note('it is one!')
else if a == 2 then
Note('it is two!')
else
Note('it is three up!')
end
end
这个if的扩充写法,网路上有教学文说:
无论else if 有几个,後面
只要一个end,听起来太美妙了!嗯~请相信自己实作的结果,他一
定跟我用不同版的Lua...
c. Table是Lua的编表格式,格式可以参考:
#6911 Hamano □ [心得] MUSHclient - Plugins:自动补 Heart
这个资料的顺序依行位决定。所以要叫出想要的资料,可以靠
自己的记忆,不然就用for回圈去比对。
#7789 hmml R: [心得] MUSHclient - Plugins:自动重设en技能
这个就是编辑者自行编排索引,也就是 key值=value值 的对应模
式,有人说这叫字典索引,可以用key直接叫出value,相对於前
一种要好记很多,如果用for回圈去翻,用key值能取value值,
value值也能回抓key值,相当方便。要注意的,是用变数去代入
key值:
变数有两种,一种是已经给名的,如:a、b、kimokimo...
另一种是还分配到正式名字的,如:%1、%2、%3....
当你将第一种的变数用在呼叫表中的对应内容时,这麽写:
TableName[a]、TableName[b]、TableName[kimokimo]、...
而第二种状态的变数,这样写:
TableName[
'%1
']、TableName[
'%2
']、TableName[
'%3
']、...
这样才能得到你想要的。
因为太整齐了,所以比zMUD好维护到不能同意更多。你愿意的话,
还能写得像亚马逊河一样,树枝状,一层叠一层,包山包海(据说
Lua本身就是那样)。一开始发现Lua没case可以用,想说用if是
要叠end到101那麽高,结果原来因为有Table,case就没那麽重要了
。
当写成Plugin时,你可以选择把Table写在
:
<send>
这里
</send>
也可以外放到
:
<script>
<![CDATA[
这里
]]>
</script>
基本上都能好好干活;不过,Table里有引用变数的话,就不同了,
第一种可以成功引用,顺利完成工作;第二种,%1只是%1,a就是a
,变数什麽的完全不知道,啊~~~苦恼啊!
d. 变数的类型有八种,由Lua自己判断是哪一种,不是使用者去决定的
,这里有一个比较麻烦的问题,就是数值>>字串,非常简单;而
字串想变成数值,有点难。这也是除错的重点。
str = loadstring("return " .. str)()
这里有一个去找来的片段,它的功能相当於zMUD的#eval。我还没
掌握这个函数(
loadstring()())的格式,不过是直接拿来用而已...
e. 虽然抓BUG抓得很苦恼,不过学习是累积经验的过程,确实,一周比
一周更顺利了。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.233.202.88
1F:→ tawi :对mush完全无法下手QAQ 04/23 07:01
2F:推 aiggkimd :good 05/19 22:13
3F:推 dawnjr :回应d点,强迫字串转数值可以用tonumber (str) 06/21 13:18