[心得] MUSHclient向全視窗或指定視窗送出命令的做法
這是一個對我而言蠻有用的功能,所以很早就在找怎麼
寫這個功能了,它相當於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
→
04/23 07:01, , 1F
04/23 07:01, 1F
推
05/19 22:13, , 2F
05/19 22:13, 2F
推
06/21 13:18, , 3F
06/21 13:18, 3F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):