巨集很難寫嗎!?
這裡有簡單的教學喔!
什麼是巨集 plugin?
使用這個 plugin 後,你可以預定指令串列(巨集),它可以手動執行或依賴狀態觸發執行。最新的版本是 2.0.2。
Contents [hide]
1 什麼是巨集 plugin?
2 安裝
2.1 安裝在 OpenKore 裡
2.2 安裝在 VisualKore 裡
3 指令
3.1 macro <巨集名> [選項] [-- 參數(們)]
3.2 macro list
3.3 macro stop
3.4 macro pause
3.5 macro resume
3.6 macro version
3.7 macro reset [<name(s)>]
3.8 macro status
4 設定各檔案
5 在撰寫巨集前
6 巨集語法
6.1 do <指令>
6.2 log <文字>
6.3 pause [<n>]
6.4 call <巨集名> [<n>]
6.5 release (<自動巨集名> | all)
6.6 lock <自動巨集名>
6.7 stop
6.8 set <選項> <數值>
6.9 變數的宣告與使用
6.10 特殊變數
6.11 巢狀變數
6.12 流程控制與標籤
6.13 條件
6.14 特殊關鍵字
6.15 "連鎖的" 指令
6.16 簡易的巨集範例
7 自動巨集的語法
7.1 自動巨集範例
8 註解
9 孤兒巨集
10 待辦事項/已知 bug/已知限制
11 下載
12 開發版本 (SVN)
13 額外
14 常見問題
14.1 求助!我安裝了這個巨集 plugin 但我的巨集指令並沒有出來!
14.2 求助!Openkore 給了我一些奇怪的錯誤然後告訴我 "一個 plugin 載入失敗"!
14.3 我有一些巨集指令用 0.9.x 版的巨集 plugin 執行得很好,但現在我只得到了語法錯誤的訊息。
14.4 什麼!我收到一個錯誤訊息說 "無法找到 encoding.pm 的位置"!
14.5 誰可以給我有某某功能的巨集?
14.6 我有一個自動巨集可用來檢查我的道具欄/手推車內某個物品的數量低於一個給定值或等於零(例如 inventory "紅色藥水" <= 30)但那個自動巨集在地圖轉換時也會觸發。為什麼會這樣以及我應該怎麼辦?
14.7 當我的 macro 在執行的時候我從地圖伺服器斷線了。
14.8 我遇到了(任何可能的)一個 perl 錯誤訊息。我應該要怎麼做?
15 論壇的討論
16 License
17 作者
安裝
安裝在 OpenKore 裡
1.下載 本巨集 plugin。
2.前往你的 OpenKore 資料夾(包含檔案 openkore.pl 的那個資料夾)。
3.在該資料夾中,假如沒有一個子資料夾叫做 plugins的話,請新增一個。
4.在巨集 plugin 的 zip 檔裡面,你會找到叫做 macro.pl 的檔案與一個叫 Macro 的資料夾。將它們解壓縮至你的 plugins 子資料夾中。
5.在你的 OpenKore control 資料夾中,新增一個空白的檔案叫做 macros.txt。在這個檔案中你將可以編輯你的巨集/自動巨集。
安裝好了之後,你的 OpenKore 樹狀檔案圖看起來應該像這樣(省略 openkore 原本存在的檔案):
openkore
|-- openkore.pl
|-- control
| `-- macros.txt
|-- fields
|-- logs
|-- plugins
| |-- Macro
| | |-- Automacro.pm
| | |-- Data.pm
| | |-- Parser.pm
| | |-- Script.pm
| | `-- Utilities.pm
| `-- macro.pl
|-- src
`-- tables
安裝在 VisualKore 裡
1.下載 本巨集 plugin。
2.在巨集 plugin 的 zip 檔裡面,你會找到叫做 macro.pl 的檔案與一個叫 Macro 的資料夾。將它們解壓縮至 C:\Program Files\VisualKore\plugins。
3.前往 VisualKore Profiles 對話框。選擇你的 profile 並點擊 "Edit Profile"。
4.會出現一個資料夾視窗。在該資料夾中,新增一個空白的檔案叫做 macros.txt。在這個檔案中你將可以編輯你的巨集/自動巨集。
要設定本 plugin 請參考 設定各檔案 這一段。
注意事項:
■本手冊中所提到的 VisualKore profile 資料夾都與 OpenKore "control" 資料夾相符合。
■要在多個 profiles 中使用相同的巨集,你必須複製你所需的 macros.txt(你的巨集指令)至每一個 profiles 資料夾中。另外,每一個 profile 的 config.txt 必須有一行設定用來避免不載入這個 plugin。
指令
macro <巨集名> [選項] [-- 參數(們)]
執行巨集 <巨集名>。
選項 數值 描述
-repeat n 重覆此巨集 n 次
-overrideAI (none) 優先於 openkore 的 AI
-macro_delay delay 對於此巨集的延遲優先於全域的 macro_delay 延遲
-exclusive (none) 不允許自動巨集中止本次巨集
-orphan method 使用 method 以處理 孤兒巨集
巨集的參數們可在雙破折號 (--) 後指定。這些參數被存放在變數 $.param1 到 $.paramN 中。範例:
macro foo {
log 參數 1 是 $.param1
log 參數 2 是 $.param2
}
當我們下指令 macro foo -- foo bar 以呼叫該巨集時,它們會顯示出
[macro] 參數 1 是 foo
[macro] 參數 2 是 bar
macro list
可列出所有有效的巨集。
macro stop
中止目前的巨集。
macro pause
暫停目前正在執行中的巨集。
macro resume
繼續已被暫停的巨集。
macro version
顯示版本號碼。
macro reset [<name(s)>]
重設所有只執行一次 (run-once) 的自動巨集或重設指定的自動巨集 <name>。
macro status
Shows whether or not a macro is currently running. If that's the case it shows the delay for the next command, the current line, overrideAI setting, whether or not it has finished and whether or not the macro registered to AI queue
設定各檔案
control/macros.txt
把你的巨集與自動巨集放在此處。
control/timeouts.txt
新增一個 macro_delay 然後以秒為單位設定它的數值,這是你希望本 plugin 在指令與指令間的暫停秒數。
control/config.txt
變數 數值 描述
macro_nowarn 0
1 當你的自動巨集沒有用到 call 時,開啟或取消惱人的警告功能
macro_orphans terminate
reregister
reregister_safe 參見 孤兒巨集這一節
macro_file filename 包含巨集指令的那個檔案(預設是 "macros.txt")
macro_allowDebug 0
1 console-check 亦處理 openkore 的除錯訊息(預設值:0)。注意:這會拖慢本 plugin 的速度。
在撰寫巨集前
請確定你已全部讀過本使用手冊了。
假如你想要在你的巨集裡使用 openkore 的指令,那麼請閱讀相關的 console 指令。注意有些像是操作運用 ai 佇列的指令是不被允許使用的。
最後,請閱讀此 佈告。它們可能包含一些實用的例子。
巨集語法
macro foo {
do this..
and that..
yattayatta..
}
理論上,你可以在巨集裡使用任何 console 端的指令。我用這個 plugin 來測試購買銀箭矢、與 NPC 交談和對其他玩家發密語。懶人們可以用這個 plugin 來完成天津通行證或其它諸如此類的任務。
do <指令>
讓 openkore 執行 <指令>。
範例:
macro foo {
do move 123 234 prontera
do sit
do c "hello world"
}
log <文字>
送出 <文字> 至 console 端。
範例:
macro foo {
log 本行記錄一串文字至 console 端。
log All your base are belong to us!
}
pause [<n>]
暫停 1 或 <n> 秒。
範例:
macro foo {
log 我在這裡,然後...
pause 10
log 現在我在這裡了。
}
call <巨集名> [<n>]
呼叫巨集 <巨集名> [<n> 次]。當 <巨集名> 結束後,當前的巨集會繼續執行。
release (<自動巨集名> | all)
重新恢復一個已封鎖的自動巨集(有 "只執行一次 (run-once)" 的關鍵字或由 "lock" 封鎖住)或使用 release all 重新恢復所有的自動巨集。
lock <自動巨集名>
封鎖一個自動巨集並取消它的觸發條件的檢驗。
stop
立刻終結目前正在跑的巨集。
set <選項> <數值>
設定巨集的特徵為:
■orphan method
■macro_delay timeout
■overrideAI [0|1]
■repeat times
■exclusive [0|1]
請參見 自動巨集 這一節。
變數的宣告與使用
你可以定義與運行自己的變數。
要設定一個變數請用 $variable = value,要呼叫此數值請使用 $variable。
使用 $variable++ 或 $variable-- 來增加或減少變數值是可允許的。
使用 @eval 來做計算。要提取以逗號分隔的項目的第一項的話請使用
macro foo {
$list = element one,element two,foo,bar,baz
$var = [$list]
log var contains $var (element one)
log list contains $list (element two,foo,bar,baz)
}
請注意變數的命名必須以字母做開頭,且全名中不能含有任何字母或數字以外的符號。
範例:
macro foo {
$var1 = world
$var2 = hello
$var3 = $var2 $var1
log next line will yell out "hello world . world . hello"
do c $var3 . $var1 . $var2
$var4 = 47
log \$var4 is $var4
$var4++
log \$var4 is $var4
$var4 = @eval ($var4 + 52)
log \$var4 is $var4
}
特殊變數
有些具唯讀特性的變數是以小數點為開頭的。
■$.map - 你所在的地圖名 ("prontera")
■$.pos - 你目前所在的座標 ("123 234")
■$.time - 以 unix 時間郵戳方式顯示的時間(自1970年1月1日凌晨0時整開始至目前時刻為止的總秒數) ("1131116304")
■$.datetime - 目前的日期與時間 ("Fri Nov 4 15:59:36 2005")
■$.hp - 目前的 hp
■$.sp - 目前的 sp
■$.lvl - 目前的 base 等級
■$.joblvl - 目前的 job 等級
■$.spirits - 目前的氣球數
■$.zeny - 目前的金錢數
■$.status - 目前的狀態,各狀態以逗號分隔
■$.lastLogMsg - 最近一次以自動巨集的 "console" 為條件所觸發的文字內容
■$.lastpub - 最近一次以自動巨集的 "pubm" 為條件所觸發的玩家名稱
■$.lastpubMsg - 承上,該玩家用公頻說話的內容
■$.lastpm - 最近一次以自動巨集的 "pm" 為條件所觸發的玩家名稱
■$.lastpmMsg - 承上,該玩家所密語的內容
■$.lastguild - 最近一次以自動巨集的 "guild" 為條件所觸發的玩家名稱
■$.lastguildMsg - 承上,該玩家用公會頻說話的內容
■$.lastparty - 最近一次以自動巨集的 "party" 為條件所觸發的玩家名稱
■$.lastpartyMsg - 承上,該玩家用隊頻說話的內容
■$.lastMonster - 最近一次以自動巨集的 "monster" 為條件所觸發的怪物名稱
■$.lastMonsterPos - 承上,該怪物最近一次已知的座標 ("123 234 prontera")
■$.lastMatchN - 最近一次的 regexp 常規表示式所符合到的 backreferences
■$.paramN - 指令行參數(請見 指令)
■$.caller - 最近一次觸發的自動巨集名
■$.hooksave - value of a hash key (argument that's given with hook)
巢狀變數
你可以定義動態的或巢狀變數。
範例:
macro foo {
$var = foo
log \$var is "foo"
${$var} = bar
log \$\$var is \$foo is "bar"
}
流程控制與標籤
所有的高階程式語言都有像是 "if .. then"、"while"、"repeat"、"for .. next"、"do .. while" 與功能呼叫的結構,它們共同的 denominators 是 "if"、"goto" 與 "while"。這就是為什麼本巨集 plugin 只支援這三種關鍵字。因為沒有(可見的)行號,所以你必須使用冒號後面加一名稱來命名一個標籤。
"while" 結構的範例:
macro foo {
$i = 0
log 下一行會重覆執行 11 次 (0 .. 10)
while ($i <= 10) as exampleloop
log loop $i
$i++
end exampleloop
}
範例:
macro foo {
$i = @random ("1", "2", "3")
if ($i == 1) goto one
if ($i == 2) goto two
log i 為三。
goto end
:one
log i 為一。
goto end
:two
log i 為二。
:end
}
注意:要前往的標籤名不能包含任何英文字母或數字以外的符號。例如:warp_to_payon 是無法運作的,必須要像是 warpToPayon 之類的名稱才可以。
條件
條件 意義
< 小於
<= 小於或等於
== 等於
>= 大於或等於
> 大於
!= 不等於
~ <左半部> 是 <右半部(以逗號分隔的項目)> 的部份元素
<left part> is element of <right part (comma-separated list)>
特殊關鍵字
@npc (<x> <y>)
傳回位於座標 (<x>,<y>) 的NPC 的 ID,假如此 NPC 找不到則傳回 -1。
@inventory (<item>)
尋找你的物品欄中的物品 <item> 並傳回其 ID,假如該物品找不到則傳回 -1。
@Inventory (<item>)
與 @inventory 相同,但是是傳回所有相符物品的 ID 並以逗號分隔開來,假如物品找不到則傳回 -1。
@cart (<item>)
尋找你的手推車中的物品 <item> 並傳回其 ID,假如該物品找不到則傳回 -1。
@Cart (<item>)
與 @cart 相同,但是是傳回所有相符物品的 ID 並以逗號分隔開來,假如物品找不到則傳回 -1。
@storage (<item>)
尋找你的倉庫中的物品 <item> 並傳回其 ID,假如該物品找不到則傳回 -1。
@Storage (<item>)
與 @storage 相同,但是是傳回所有相符物品的 ID 並以逗號分隔開來,假如物品找不到則傳回 -1。
@player (<name>)
尋覓玩家並傳回其 ID,假如該玩家找不到則傳回 -1。
@vender (<name>)
尋覓露店並傳回其 ID,假如該露店找不到則傳回 -1。
@store (<name>)
尋覓商店中的物品並傳回其 ID,假如物品找不到則傳回 -1。
@random ("<參數 1>"[, "<參數 2>"[, ...]])
隨機傳回給定參數中的其中一個參數。
@rand (<n>, <m>)
隨機傳回(含)數字 <n> 與 <m> 之間的任一個數字。
@invamount (<item>)
傳回物品欄中指定的 <item> 的數量。
@cartamount (<item>)
傳回手推車中指定的 <item> 的數量。
@shopamount (<item>)
傳回商店中指定的 <item> 的數量。
@storamount (<item>)
傳回倉庫中指定的 <item> 的數量。
@eval (<參數>)
求給定的 <參數> 的數值。
@arg ("<參數>", <n>)
傳回 <參數> 中的第 <n> 個字,假如 <n> 超過 <argument> 所能包含的範圍的話,則傳回空字串。
@config (<變數>)
傳回 config.txt 中指定的 <變數> 的設定值。
"連鎖的" 指令
你可以在不用等待 openkore 的 ai 或 macro_delay 或其它延遲的條件下連續地執行多個指令。只要用 [ 與 ] 把要執行的指令框起來就可以了。
範例(含行號):
0 macro foo {
1 do whatever
2 log yet another line
3 [
4 do something
5 do something else
6 log foo
7 ]
8 log done
9 }
第 3 行開始了連鎖模式。這一行沒有延遲。第4、5、6行與前面一行一樣在沒有延遲時間下快速地執行完且無法被中斷。第 7 行停止了連鎖模式,然後第 8 行將會在延遲 $macro_delay 秒後被執行。
簡易的巨集範例
範例:
macro foo {
$foobegin = $.pos
do move 168 128 prt_in
do talk @npc (172 130)
do store
do store
do buy @store (銀箭矢) 10000
do move 280 198 prontera
do talk @npc (282 200)
do talk cont
do talk resp 1
do storage add @inventory (銀箭矢) @eval (@invamount (銀箭矢) - 1000)
do move $foobegin
}
當經由指令 "macro foo [times]" 啟動此巨集時,此巨集做了以下的事:
■存放角色的座標於 "foobegin" 變數中
■ 移動至 168 128 prt_in(武器店)
■與位於座標 172 130 的 NPC 交談(武器店員)
■輸入 "store" 兩次以顯示該店員賣的東西
■買入 10,000 支銀箭矢
■移動至 280 198 prontera(中央東門)
■與卡普拉交談
■使用 talk cont 與 talk resp 1 以開啟倉庫
■把銀箭矢都放進倉庫,只留 1000 支在身上,最後,
■回到我們開始執行本巨集前的座標
自動巨集的語法
範例:
automacro foo {
<觸發條件> bar
<觸發條件> baz, yatta
call macroname
}
automacro mi {
<觸發條件> moo
<觸發條件> xyz
call {
do this
do that
}
}
自動巨集是當某些給定的條件相符後會自動觸發執行的巨集。
map <地圖名>
當你目前的地圖為 <地圖名> 的時候會觸發。
location [not] <地圖名 [<x1> <y1> [<x2> <y2>]] [, ...]
當你(不)在指定的座標時會觸發。
當沒有給定 <x1> <y1> 也沒有給定 <x2> <y2> 時,會以(不)在 <地圖名> 時當做觸發條件。
當沒有給定 <x2> <y2> 時會以(不)在 <地圖名> 的 (<x1>,<y1>) 時當做觸發條件。
當 <x1> <y1> 與 <x2> <y2> 都有定義時,會以你在 <地圖名> 中的 <x1>, <y1>(上左點)與 <x2>, <y2>(下右點,當 <x1> < <x2> 及 <y1> > <y2> 時)之間的任一點當做觸發條件。
以逗號分隔的參數是以 OR 條件來處理:
範例:
location geffen, prontera 123 234
當你在吉芬或是在中央座標 123 234 的時候會觸發。
多行之間是以 AND 條件來處理:
範例:
location not geffen
location not prontera
當你不在吉芬也不在中央的時候會觸發。
mapchange (<地圖名>|any) [, ...]
當地圖改變至 <地圖名> 時會觸發。假如參數為 any 的話那麼只要地圖有任何更換就會觸發。
以逗號分隔的參數是以 OR 條件來處理。
hp <條件> <數量>[%]
當你的 hp 符合 <條件> <數量>(絕對數值)或 <條件> <數量> 百分比(相對數值)時會觸發。
多行之間是以 AND 條件來處理。
sp <條件> <數量>[%]
當你的 sp 符合 <條件> <數量>(絕對數值)或 <條件> <數量> 百分比(相對數值)時會觸發。
多行之間是以 AND 條件來處理。
spirit <條件> <數量>
當你的氣球數符合 <條件> <數量> 時會觸發。
多行之間是以 AND 條件來處理。
weight <條件> <數量>[%]
當你的負重符合 <條件> <數量> (絕對數值)或 <條件> <數量> 百分比(相對數值)時會觸發。
多行之間是以 AND 條件來處理。
cartweight <條件> <數量>[%]
當你的手推車負重符合 <條件> <數量>(絕對數值)或 <條件> <數量> 百分比(相對數值)時會觸發。
多行之間是以 AND 條件來處理。
zeny <條件> <數量>
當你的金錢數符合 <條件> <數量> 時會觸發。
多行之間是以 AND 條件來處理。
soldout <條件> <商品槽數>
當你的露店中已賣出的商品槽數符合 <條件> <商品槽數> 時會觸發。
多行之間是以 AND 條件來處理。
status [not] <status> [, ...]
當你(不)為狀態 <status> 時會觸發。
"死亡 (dead)" 與 "禁言 (muted)" 狀態已被附加支援。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
inventory "<物品>" <條件> <數量> [, ...]
當你擁有 <條件> <數量> 的 <物品> 在你的物品欄時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
storage "<物品>" <條件> <數量> [, ...]
當你擁有 <條件> <數量> 的 <物品> 在你的倉庫欄時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
cart "<物品>" <條件> <數量> [, ...]
當你擁有 <條件> <數量> 的 <物品> 在你的手推車欄時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
shop "<物品>" <條件> <數量> [, ...]
當你擁有 <條件> <數量> 的 <物品> 在你的露店欄時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
base <條件> <等級>
當你的 base 等級符合 <條件> <等級> 時會觸發。
多行之間是以 AND 條件來處理。
job <條件> <等級>
當你的 job 等級符合 <條件> <等級> 時會觸發。
多行之間是以 AND 條件來處理。
class <job>
當你的職業是 <job> 時會觸發。
spell <spell> [, ...]
當有人施放法術 <spell> 在你身上或你位於該法術範圍時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
monster <怪物名> [, ...]
當怪物 <怪物名> 在附近時會觸發。
當觸發後,特別的變數 $.lastMonster 與 $.lastMonsterPos 會被設定。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
notMonster <怪物名> [, ...]
當某個不在列表之中的怪物出現時會觸發。
以逗號分隔的參數是以 AND 條件來處理。
aggressives <條件> <數目>
在主動怪有 <數目> 隻時會觸發。
多行之間是以 AND 條件來處理。
player ("<玩家名>"|/<常規表示式>/) [, <距離> ]
當玩家 <玩家名> 在視野範圍中或在 <距離> 格數範圍內時會觸發。
多行之間是以 AND 條件來處理。
equipped [<slot>] (<item>|none) [, ...]
當物品 <item> 或 沒有物品(none) 被裝備在裝備槽 [<slot>] 中時會觸發。
裝備槽可為 topHead、midHead、lowHead、leftHand、rightHand、robe、armor、shoes、 leftAccessory、rightAccessory 與 arrow。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
var <變數> (unset|<條件> <數值>)
當 <變數> 未設定(unset) 或符合 <條件> <數值> 時會觸發。
多行之間是以 AND 條件來處理。
varvar <巢狀變數> (unset|<條件> <數值>)
當 <巢狀變數> 未設定(unset) 或符合 <條件> <數值> 時會觸發。
多行之間是以 AND 條件來處理。
console ("<文字>"|/<常規表示式>/)
當 <文字> 在 console 端被接收到或接收到的文字符合 <常規表示式> 時會觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
$.lastLogMsg 會被設定。
pm ("<文字>"|/<常規表示式>/) [, <玩家名>]
當 <文字> 經由 <玩家名> 密語給你時或該文字符合 <常規表示式> 時會被觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
$.lastpm 與 $.lastpmMsg 會被設定。
pubm ("<文字>"|/<常規表示式>/) [, <距離>]
當公頻訊息 [在 <距離> 範圍內] 被接收到且它的內容是 <文字> 或符合 <常規表示式> 時會被觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
$.lastpub 與 $.lastpubMsg 會被設定。
party ("<文字>"|/<常規表示式>/)
當 <文字> 經由隊頻被接收到或該文字符合 <常規表示式> 時會被觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
$.lastparty 與 $.lastpartyMsg 會被設定。
guild ("<文字>"|/<常規表示式>/)
當 <文字> 經由公會頻被接收到或該文字符合 <常規表示式> 時會被觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
$.lastguild 與 $.lastguildMsg 會被設定。
hook <hookname>
當 openkore 呼叫 <hookname> 時會被觸發。
save <hash key>
(用來與 hook 連接)
將 <hash key> 的值儲存在變數 .hooksave1 至 .hooksave 中。
run-once (0|1)
當設為 1 時該自動巨集會在觸發後失效(只觸發一次,之後便不再觸發)。
可使用巨集指令 release 使該自動巨集重新恢復。
overrideAI (0|1)
當設為 1 時該巨集會忽略 openkore 的 AI。這表示巨集不會暫停在 "人物移動" 或 "死亡狀態" 時。
delay <n>
在呼叫下一個巨集前等待 <n> 秒。
timeout <n>
在同一個自動巨集被觸發過後等待至少 <n> 秒才可再度被觸發。
macro_delay <n>
針對被呼叫的巨集,覆蓋掉它的 macro delay 全域設定。
priority <數字>
決定哪個自動巨集應該要比其它自動巨集來得優先檢查觸發條件。<數字> 越小表示該自動巨集會越快被檢查。假如沒有給定優先度,那麼優先度會假設為 0(零:最先檢查)。
exclusive (0|1)
擁有 exclusive 設定的自動巨集不會被其它自動巨集給中斷掉。
以往 1.3.0 版的時候,正在執行中的巨集預設為可被自動巨集給中斷掉。要取消該行為,可用本選項設定或使用指令行選項 -exclusive 來設定。
set <variable> <數值>
設定變數 <variable> 為 <數值>。對於每個自動巨集,你都可以有多行以上的 set 行。(You can have multiple set lines per automacro.)
call <巨集名>
當自動巨集被觸發後,呼叫巨集 <巨集名>。
call {
<指示>
}
當自動巨集被觸發後,直接執行 <指示>。
orphan <方法>
設定如何處理 孤兒 巨集的 <方法>。
自動巨集範例
範例:
automacro checkshop {
location prontera
soldout >= 3
delay 60
call reopenshop
}
macro reopenshop {
do closeshop
}
本自動巨集會在你開設露店於普隆德拉且有三個或更多個商品項目被賣光時觸發。當觸發後,它會等一分鐘然後呼叫巨集 "reopenshop" 來關閉你的露店。假如你有設定 shopAuto_open 或 autoshop 為 1 的話,它會在過一陣子後重新開設露店。
註解
巨集檔案允許有註解,即可被巨集 plugin 忽略的文字行。行首以 # 開頭的文字行會被當做是註解。
範例:
# 本行為註解行
孤兒巨集
孤兒(沒人管理的)巨集有可能發生──舉個例來說,當巨集在跑的時候使用了 ai clear 指令──這時該巨集就會變成孤兒巨集。那表示該巨集物件存在但無法繼續,because it requires the AI queue to contain the entry "macro" (or "deal") at the first place. 當 AI 序列被清除時,該"巨集"的 entry 會消失。
在 1.0.2 版之前這個問題必須要經由手動輸入 "macro stop" 來解決。在 1.0.2 及以上的版本你可以選擇應該要用什麼機制來解決此爭議。有三個方法可使用:
terminate 中止該巨集(相當於 macro stop)
reregister 重新註冊至 AI 序列,覆蓋其它的 entry。
這表示強迫該巨集繼續執行。
reregister_safe 當 AI 閒置時再重新註冊至 AI 序列。
這表示該巨集會在所有其它工作項目做完後繼續。
待辦事項/已知 bug/已知限制
■自動巨集的 console 觸發檢查功能會忽略以下的定義域:macro 與 cvsdebug。
■請勿在關鍵字參數中使用右括號 ")",除非它代表一個參數結尾要用到的右括號。舉例來說:@random ("foo", "bar", "@eval (4 + 5)", "yatta") 是可允許的,@random ("foo", "bar", ":-)", "yatta") 是不允許的。
■若 macros.txt 中的第一個區塊無法執行的話,請跳過 macros.txt 中的第一行,改由第二行開始撰寫巨集。第一行可加上 "#####" 來表示此行為註解行。
假如有任何的 bug,請回報它們給我。使用責任自負,我將不會給予以上所述的任何保證。所以假如以上所舉的例子讓你不小心買了 10,000 支笨拙短劍,我不會對此負責(這不太可能會發生,但仍須謹慎..^^)。希望就這些了。祝你玩得愉快。
這裡有簡單的教學喔!
什麼是巨集 plugin?
使用這個 plugin 後,你可以預定指令串列(巨集),它可以手動執行或依賴狀態觸發執行。最新的版本是 2.0.2。
Contents [hide]
1 什麼是巨集 plugin?
2 安裝
2.1 安裝在 OpenKore 裡
2.2 安裝在 VisualKore 裡
3 指令
3.1 macro <巨集名> [選項] [-- 參數(們)]
3.2 macro list
3.3 macro stop
3.4 macro pause
3.5 macro resume
3.6 macro version
3.7 macro reset [<name(s)>]
3.8 macro status
4 設定各檔案
5 在撰寫巨集前
6 巨集語法
6.1 do <指令>
6.2 log <文字>
6.3 pause [<n>]
6.4 call <巨集名> [<n>]
6.5 release (<自動巨集名> | all)
6.6 lock <自動巨集名>
6.7 stop
6.8 set <選項> <數值>
6.9 變數的宣告與使用
6.10 特殊變數
6.11 巢狀變數
6.12 流程控制與標籤
6.13 條件
6.14 特殊關鍵字
6.15 "連鎖的" 指令
6.16 簡易的巨集範例
7 自動巨集的語法
7.1 自動巨集範例
8 註解
9 孤兒巨集
10 待辦事項/已知 bug/已知限制
11 下載
12 開發版本 (SVN)
13 額外
14 常見問題
14.1 求助!我安裝了這個巨集 plugin 但我的巨集指令並沒有出來!
14.2 求助!Openkore 給了我一些奇怪的錯誤然後告訴我 "一個 plugin 載入失敗"!
14.3 我有一些巨集指令用 0.9.x 版的巨集 plugin 執行得很好,但現在我只得到了語法錯誤的訊息。
14.4 什麼!我收到一個錯誤訊息說 "無法找到 encoding.pm 的位置"!
14.5 誰可以給我有某某功能的巨集?
14.6 我有一個自動巨集可用來檢查我的道具欄/手推車內某個物品的數量低於一個給定值或等於零(例如 inventory "紅色藥水" <= 30)但那個自動巨集在地圖轉換時也會觸發。為什麼會這樣以及我應該怎麼辦?
14.7 當我的 macro 在執行的時候我從地圖伺服器斷線了。
14.8 我遇到了(任何可能的)一個 perl 錯誤訊息。我應該要怎麼做?
15 論壇的討論
16 License
17 作者
安裝
安裝在 OpenKore 裡
1.下載 本巨集 plugin。
2.前往你的 OpenKore 資料夾(包含檔案 openkore.pl 的那個資料夾)。
3.在該資料夾中,假如沒有一個子資料夾叫做 plugins的話,請新增一個。
4.在巨集 plugin 的 zip 檔裡面,你會找到叫做 macro.pl 的檔案與一個叫 Macro 的資料夾。將它們解壓縮至你的 plugins 子資料夾中。
5.在你的 OpenKore control 資料夾中,新增一個空白的檔案叫做 macros.txt。在這個檔案中你將可以編輯你的巨集/自動巨集。
安裝好了之後,你的 OpenKore 樹狀檔案圖看起來應該像這樣(省略 openkore 原本存在的檔案):
openkore
|-- openkore.pl
|-- control
| `-- macros.txt
|-- fields
|-- logs
|-- plugins
| |-- Macro
| | |-- Automacro.pm
| | |-- Data.pm
| | |-- Parser.pm
| | |-- Script.pm
| | `-- Utilities.pm
| `-- macro.pl
|-- src
`-- tables
安裝在 VisualKore 裡
1.下載 本巨集 plugin。
2.在巨集 plugin 的 zip 檔裡面,你會找到叫做 macro.pl 的檔案與一個叫 Macro 的資料夾。將它們解壓縮至 C:\Program Files\VisualKore\plugins。
3.前往 VisualKore Profiles 對話框。選擇你的 profile 並點擊 "Edit Profile"。
4.會出現一個資料夾視窗。在該資料夾中,新增一個空白的檔案叫做 macros.txt。在這個檔案中你將可以編輯你的巨集/自動巨集。
要設定本 plugin 請參考 設定各檔案 這一段。
注意事項:
■本手冊中所提到的 VisualKore profile 資料夾都與 OpenKore "control" 資料夾相符合。
■要在多個 profiles 中使用相同的巨集,你必須複製你所需的 macros.txt(你的巨集指令)至每一個 profiles 資料夾中。另外,每一個 profile 的 config.txt 必須有一行設定用來避免不載入這個 plugin。
指令
macro <巨集名> [選項] [-- 參數(們)]
執行巨集 <巨集名>。
選項 數值 描述
-repeat n 重覆此巨集 n 次
-overrideAI (none) 優先於 openkore 的 AI
-macro_delay delay 對於此巨集的延遲優先於全域的 macro_delay 延遲
-exclusive (none) 不允許自動巨集中止本次巨集
-orphan method 使用 method 以處理 孤兒巨集
巨集的參數們可在雙破折號 (--) 後指定。這些參數被存放在變數 $.param1 到 $.paramN 中。範例:
macro foo {
log 參數 1 是 $.param1
log 參數 2 是 $.param2
}
當我們下指令 macro foo -- foo bar 以呼叫該巨集時,它們會顯示出
[macro] 參數 1 是 foo
[macro] 參數 2 是 bar
macro list
可列出所有有效的巨集。
macro stop
中止目前的巨集。
macro pause
暫停目前正在執行中的巨集。
macro resume
繼續已被暫停的巨集。
macro version
顯示版本號碼。
macro reset [<name(s)>]
重設所有只執行一次 (run-once) 的自動巨集或重設指定的自動巨集 <name>。
macro status
Shows whether or not a macro is currently running. If that's the case it shows the delay for the next command, the current line, overrideAI setting, whether or not it has finished and whether or not the macro registered to AI queue
設定各檔案
control/macros.txt
把你的巨集與自動巨集放在此處。
control/timeouts.txt
新增一個 macro_delay 然後以秒為單位設定它的數值,這是你希望本 plugin 在指令與指令間的暫停秒數。
control/config.txt
變數 數值 描述
macro_nowarn 0
1 當你的自動巨集沒有用到 call 時,開啟或取消惱人的警告功能
macro_orphans terminate
reregister
reregister_safe 參見 孤兒巨集這一節
macro_file filename 包含巨集指令的那個檔案(預設是 "macros.txt")
macro_allowDebug 0
1 console-check 亦處理 openkore 的除錯訊息(預設值:0)。注意:這會拖慢本 plugin 的速度。
在撰寫巨集前
請確定你已全部讀過本使用手冊了。
假如你想要在你的巨集裡使用 openkore 的指令,那麼請閱讀相關的 console 指令。注意有些像是操作運用 ai 佇列的指令是不被允許使用的。
最後,請閱讀此 佈告。它們可能包含一些實用的例子。
巨集語法
macro foo {
do this..
and that..
yattayatta..
}
理論上,你可以在巨集裡使用任何 console 端的指令。我用這個 plugin 來測試購買銀箭矢、與 NPC 交談和對其他玩家發密語。懶人們可以用這個 plugin 來完成天津通行證或其它諸如此類的任務。
do <指令>
讓 openkore 執行 <指令>。
範例:
macro foo {
do move 123 234 prontera
do sit
do c "hello world"
}
log <文字>
送出 <文字> 至 console 端。
範例:
macro foo {
log 本行記錄一串文字至 console 端。
log All your base are belong to us!
}
pause [<n>]
暫停 1 或 <n> 秒。
範例:
macro foo {
log 我在這裡,然後...
pause 10
log 現在我在這裡了。
}
call <巨集名> [<n>]
呼叫巨集 <巨集名> [<n> 次]。當 <巨集名> 結束後,當前的巨集會繼續執行。
release (<自動巨集名> | all)
重新恢復一個已封鎖的自動巨集(有 "只執行一次 (run-once)" 的關鍵字或由 "lock" 封鎖住)或使用 release all 重新恢復所有的自動巨集。
lock <自動巨集名>
封鎖一個自動巨集並取消它的觸發條件的檢驗。
stop
立刻終結目前正在跑的巨集。
set <選項> <數值>
設定巨集的特徵為:
■orphan method
■macro_delay timeout
■overrideAI [0|1]
■repeat times
■exclusive [0|1]
請參見 自動巨集 這一節。
變數的宣告與使用
你可以定義與運行自己的變數。
要設定一個變數請用 $variable = value,要呼叫此數值請使用 $variable。
使用 $variable++ 或 $variable-- 來增加或減少變數值是可允許的。
使用 @eval 來做計算。要提取以逗號分隔的項目的第一項的話請使用
macro foo {
$list = element one,element two,foo,bar,baz
$var = [$list]
log var contains $var (element one)
log list contains $list (element two,foo,bar,baz)
}
請注意變數的命名必須以字母做開頭,且全名中不能含有任何字母或數字以外的符號。
範例:
macro foo {
$var1 = world
$var2 = hello
$var3 = $var2 $var1
log next line will yell out "hello world . world . hello"
do c $var3 . $var1 . $var2
$var4 = 47
log \$var4 is $var4
$var4++
log \$var4 is $var4
$var4 = @eval ($var4 + 52)
log \$var4 is $var4
}
特殊變數
有些具唯讀特性的變數是以小數點為開頭的。
■$.map - 你所在的地圖名 ("prontera")
■$.pos - 你目前所在的座標 ("123 234")
■$.time - 以 unix 時間郵戳方式顯示的時間(自1970年1月1日凌晨0時整開始至目前時刻為止的總秒數) ("1131116304")
■$.datetime - 目前的日期與時間 ("Fri Nov 4 15:59:36 2005")
■$.hp - 目前的 hp
■$.sp - 目前的 sp
■$.lvl - 目前的 base 等級
■$.joblvl - 目前的 job 等級
■$.spirits - 目前的氣球數
■$.zeny - 目前的金錢數
■$.status - 目前的狀態,各狀態以逗號分隔
■$.lastLogMsg - 最近一次以自動巨集的 "console" 為條件所觸發的文字內容
■$.lastpub - 最近一次以自動巨集的 "pubm" 為條件所觸發的玩家名稱
■$.lastpubMsg - 承上,該玩家用公頻說話的內容
■$.lastpm - 最近一次以自動巨集的 "pm" 為條件所觸發的玩家名稱
■$.lastpmMsg - 承上,該玩家所密語的內容
■$.lastguild - 最近一次以自動巨集的 "guild" 為條件所觸發的玩家名稱
■$.lastguildMsg - 承上,該玩家用公會頻說話的內容
■$.lastparty - 最近一次以自動巨集的 "party" 為條件所觸發的玩家名稱
■$.lastpartyMsg - 承上,該玩家用隊頻說話的內容
■$.lastMonster - 最近一次以自動巨集的 "monster" 為條件所觸發的怪物名稱
■$.lastMonsterPos - 承上,該怪物最近一次已知的座標 ("123 234 prontera")
■$.lastMatchN - 最近一次的 regexp 常規表示式所符合到的 backreferences
■$.paramN - 指令行參數(請見 指令)
■$.caller - 最近一次觸發的自動巨集名
■$.hooksave - value of a hash key (argument that's given with hook)
巢狀變數
你可以定義動態的或巢狀變數。
範例:
macro foo {
$var = foo
log \$var is "foo"
${$var} = bar
log \$\$var is \$foo is "bar"
}
流程控制與標籤
所有的高階程式語言都有像是 "if .. then"、"while"、"repeat"、"for .. next"、"do .. while" 與功能呼叫的結構,它們共同的 denominators 是 "if"、"goto" 與 "while"。這就是為什麼本巨集 plugin 只支援這三種關鍵字。因為沒有(可見的)行號,所以你必須使用冒號後面加一名稱來命名一個標籤。
"while" 結構的範例:
macro foo {
$i = 0
log 下一行會重覆執行 11 次 (0 .. 10)
while ($i <= 10) as exampleloop
log loop $i
$i++
end exampleloop
}
範例:
macro foo {
$i = @random ("1", "2", "3")
if ($i == 1) goto one
if ($i == 2) goto two
log i 為三。
goto end
:one
log i 為一。
goto end
:two
log i 為二。
:end
}
注意:要前往的標籤名不能包含任何英文字母或數字以外的符號。例如:warp_to_payon 是無法運作的,必須要像是 warpToPayon 之類的名稱才可以。
條件
條件 意義
< 小於
<= 小於或等於
== 等於
>= 大於或等於
> 大於
!= 不等於
~ <左半部> 是 <右半部(以逗號分隔的項目)> 的部份元素
<left part> is element of <right part (comma-separated list)>
特殊關鍵字
@npc (<x> <y>)
傳回位於座標 (<x>,<y>) 的NPC 的 ID,假如此 NPC 找不到則傳回 -1。
@inventory (<item>)
尋找你的物品欄中的物品 <item> 並傳回其 ID,假如該物品找不到則傳回 -1。
@Inventory (<item>)
與 @inventory 相同,但是是傳回所有相符物品的 ID 並以逗號分隔開來,假如物品找不到則傳回 -1。
@cart (<item>)
尋找你的手推車中的物品 <item> 並傳回其 ID,假如該物品找不到則傳回 -1。
@Cart (<item>)
與 @cart 相同,但是是傳回所有相符物品的 ID 並以逗號分隔開來,假如物品找不到則傳回 -1。
@storage (<item>)
尋找你的倉庫中的物品 <item> 並傳回其 ID,假如該物品找不到則傳回 -1。
@Storage (<item>)
與 @storage 相同,但是是傳回所有相符物品的 ID 並以逗號分隔開來,假如物品找不到則傳回 -1。
@player (<name>)
尋覓玩家並傳回其 ID,假如該玩家找不到則傳回 -1。
@vender (<name>)
尋覓露店並傳回其 ID,假如該露店找不到則傳回 -1。
@store (<name>)
尋覓商店中的物品並傳回其 ID,假如物品找不到則傳回 -1。
@random ("<參數 1>"[, "<參數 2>"[, ...]])
隨機傳回給定參數中的其中一個參數。
@rand (<n>, <m>)
隨機傳回(含)數字 <n> 與 <m> 之間的任一個數字。
@invamount (<item>)
傳回物品欄中指定的 <item> 的數量。
@cartamount (<item>)
傳回手推車中指定的 <item> 的數量。
@shopamount (<item>)
傳回商店中指定的 <item> 的數量。
@storamount (<item>)
傳回倉庫中指定的 <item> 的數量。
@eval (<參數>)
求給定的 <參數> 的數值。
@arg ("<參數>", <n>)
傳回 <參數> 中的第 <n> 個字,假如 <n> 超過 <argument> 所能包含的範圍的話,則傳回空字串。
@config (<變數>)
傳回 config.txt 中指定的 <變數> 的設定值。
"連鎖的" 指令
你可以在不用等待 openkore 的 ai 或 macro_delay 或其它延遲的條件下連續地執行多個指令。只要用 [ 與 ] 把要執行的指令框起來就可以了。
範例(含行號):
0 macro foo {
1 do whatever
2 log yet another line
3 [
4 do something
5 do something else
6 log foo
7 ]
8 log done
9 }
第 3 行開始了連鎖模式。這一行沒有延遲。第4、5、6行與前面一行一樣在沒有延遲時間下快速地執行完且無法被中斷。第 7 行停止了連鎖模式,然後第 8 行將會在延遲 $macro_delay 秒後被執行。
簡易的巨集範例
範例:
macro foo {
$foobegin = $.pos
do move 168 128 prt_in
do talk @npc (172 130)
do store
do store
do buy @store (銀箭矢) 10000
do move 280 198 prontera
do talk @npc (282 200)
do talk cont
do talk resp 1
do storage add @inventory (銀箭矢) @eval (@invamount (銀箭矢) - 1000)
do move $foobegin
}
當經由指令 "macro foo [times]" 啟動此巨集時,此巨集做了以下的事:
■存放角色的座標於 "foobegin" 變數中
■ 移動至 168 128 prt_in(武器店)
■與位於座標 172 130 的 NPC 交談(武器店員)
■輸入 "store" 兩次以顯示該店員賣的東西
■買入 10,000 支銀箭矢
■移動至 280 198 prontera(中央東門)
■與卡普拉交談
■使用 talk cont 與 talk resp 1 以開啟倉庫
■把銀箭矢都放進倉庫,只留 1000 支在身上,最後,
■回到我們開始執行本巨集前的座標
自動巨集的語法
範例:
automacro foo {
<觸發條件> bar
<觸發條件> baz, yatta
call macroname
}
automacro mi {
<觸發條件> moo
<觸發條件> xyz
call {
do this
do that
}
}
自動巨集是當某些給定的條件相符後會自動觸發執行的巨集。
map <地圖名>
當你目前的地圖為 <地圖名> 的時候會觸發。
location [not] <地圖名 [<x1> <y1> [<x2> <y2>]] [, ...]
當你(不)在指定的座標時會觸發。
當沒有給定 <x1> <y1> 也沒有給定 <x2> <y2> 時,會以(不)在 <地圖名> 時當做觸發條件。
當沒有給定 <x2> <y2> 時會以(不)在 <地圖名> 的 (<x1>,<y1>) 時當做觸發條件。
當 <x1> <y1> 與 <x2> <y2> 都有定義時,會以你在 <地圖名> 中的 <x1>, <y1>(上左點)與 <x2>, <y2>(下右點,當 <x1> < <x2> 及 <y1> > <y2> 時)之間的任一點當做觸發條件。
以逗號分隔的參數是以 OR 條件來處理:
範例:
location geffen, prontera 123 234
當你在吉芬或是在中央座標 123 234 的時候會觸發。
多行之間是以 AND 條件來處理:
範例:
location not geffen
location not prontera
當你不在吉芬也不在中央的時候會觸發。
mapchange (<地圖名>|any) [, ...]
當地圖改變至 <地圖名> 時會觸發。假如參數為 any 的話那麼只要地圖有任何更換就會觸發。
以逗號分隔的參數是以 OR 條件來處理。
hp <條件> <數量>[%]
當你的 hp 符合 <條件> <數量>(絕對數值)或 <條件> <數量> 百分比(相對數值)時會觸發。
多行之間是以 AND 條件來處理。
sp <條件> <數量>[%]
當你的 sp 符合 <條件> <數量>(絕對數值)或 <條件> <數量> 百分比(相對數值)時會觸發。
多行之間是以 AND 條件來處理。
spirit <條件> <數量>
當你的氣球數符合 <條件> <數量> 時會觸發。
多行之間是以 AND 條件來處理。
weight <條件> <數量>[%]
當你的負重符合 <條件> <數量> (絕對數值)或 <條件> <數量> 百分比(相對數值)時會觸發。
多行之間是以 AND 條件來處理。
cartweight <條件> <數量>[%]
當你的手推車負重符合 <條件> <數量>(絕對數值)或 <條件> <數量> 百分比(相對數值)時會觸發。
多行之間是以 AND 條件來處理。
zeny <條件> <數量>
當你的金錢數符合 <條件> <數量> 時會觸發。
多行之間是以 AND 條件來處理。
soldout <條件> <商品槽數>
當你的露店中已賣出的商品槽數符合 <條件> <商品槽數> 時會觸發。
多行之間是以 AND 條件來處理。
status [not] <status> [, ...]
當你(不)為狀態 <status> 時會觸發。
"死亡 (dead)" 與 "禁言 (muted)" 狀態已被附加支援。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
inventory "<物品>" <條件> <數量> [, ...]
當你擁有 <條件> <數量> 的 <物品> 在你的物品欄時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
storage "<物品>" <條件> <數量> [, ...]
當你擁有 <條件> <數量> 的 <物品> 在你的倉庫欄時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
cart "<物品>" <條件> <數量> [, ...]
當你擁有 <條件> <數量> 的 <物品> 在你的手推車欄時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
shop "<物品>" <條件> <數量> [, ...]
當你擁有 <條件> <數量> 的 <物品> 在你的露店欄時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
base <條件> <等級>
當你的 base 等級符合 <條件> <等級> 時會觸發。
多行之間是以 AND 條件來處理。
job <條件> <等級>
當你的 job 等級符合 <條件> <等級> 時會觸發。
多行之間是以 AND 條件來處理。
class <job>
當你的職業是 <job> 時會觸發。
spell <spell> [, ...]
當有人施放法術 <spell> 在你身上或你位於該法術範圍時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
monster <怪物名> [, ...]
當怪物 <怪物名> 在附近時會觸發。
當觸發後,特別的變數 $.lastMonster 與 $.lastMonsterPos 會被設定。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
notMonster <怪物名> [, ...]
當某個不在列表之中的怪物出現時會觸發。
以逗號分隔的參數是以 AND 條件來處理。
aggressives <條件> <數目>
在主動怪有 <數目> 隻時會觸發。
多行之間是以 AND 條件來處理。
player ("<玩家名>"|/<常規表示式>/) [, <距離> ]
當玩家 <玩家名> 在視野範圍中或在 <距離> 格數範圍內時會觸發。
多行之間是以 AND 條件來處理。
equipped [<slot>] (<item>|none) [, ...]
當物品 <item> 或 沒有物品(none) 被裝備在裝備槽 [<slot>] 中時會觸發。
裝備槽可為 topHead、midHead、lowHead、leftHand、rightHand、robe、armor、shoes、 leftAccessory、rightAccessory 與 arrow。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
var <變數> (unset|<條件> <數值>)
當 <變數> 未設定(unset) 或符合 <條件> <數值> 時會觸發。
多行之間是以 AND 條件來處理。
varvar <巢狀變數> (unset|<條件> <數值>)
當 <巢狀變數> 未設定(unset) 或符合 <條件> <數值> 時會觸發。
多行之間是以 AND 條件來處理。
console ("<文字>"|/<常規表示式>/)
當 <文字> 在 console 端被接收到或接收到的文字符合 <常規表示式> 時會觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
$.lastLogMsg 會被設定。
pm ("<文字>"|/<常規表示式>/) [, <玩家名>]
當 <文字> 經由 <玩家名> 密語給你時或該文字符合 <常規表示式> 時會被觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
$.lastpm 與 $.lastpmMsg 會被設定。
pubm ("<文字>"|/<常規表示式>/) [, <距離>]
當公頻訊息 [在 <距離> 範圍內] 被接收到且它的內容是 <文字> 或符合 <常規表示式> 時會被觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
$.lastpub 與 $.lastpubMsg 會被設定。
party ("<文字>"|/<常規表示式>/)
當 <文字> 經由隊頻被接收到或該文字符合 <常規表示式> 時會被觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
$.lastparty 與 $.lastpartyMsg 會被設定。
guild ("<文字>"|/<常規表示式>/)
當 <文字> 經由公會頻被接收到或該文字符合 <常規表示式> 時會被觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
$.lastguild 與 $.lastguildMsg 會被設定。
hook <hookname>
當 openkore 呼叫 <hookname> 時會被觸發。
save <hash key>
(用來與 hook 連接)
將 <hash key> 的值儲存在變數 .hooksave1 至 .hooksave 中。
run-once (0|1)
當設為 1 時該自動巨集會在觸發後失效(只觸發一次,之後便不再觸發)。
可使用巨集指令 release 使該自動巨集重新恢復。
overrideAI (0|1)
當設為 1 時該巨集會忽略 openkore 的 AI。這表示巨集不會暫停在 "人物移動" 或 "死亡狀態" 時。
delay <n>
在呼叫下一個巨集前等待 <n> 秒。
timeout <n>
在同一個自動巨集被觸發過後等待至少 <n> 秒才可再度被觸發。
macro_delay <n>
針對被呼叫的巨集,覆蓋掉它的 macro delay 全域設定。
priority <數字>
決定哪個自動巨集應該要比其它自動巨集來得優先檢查觸發條件。<數字> 越小表示該自動巨集會越快被檢查。假如沒有給定優先度,那麼優先度會假設為 0(零:最先檢查)。
exclusive (0|1)
擁有 exclusive 設定的自動巨集不會被其它自動巨集給中斷掉。
以往 1.3.0 版的時候,正在執行中的巨集預設為可被自動巨集給中斷掉。要取消該行為,可用本選項設定或使用指令行選項 -exclusive 來設定。
set <variable> <數值>
設定變數 <variable> 為 <數值>。對於每個自動巨集,你都可以有多行以上的 set 行。(You can have multiple set lines per automacro.)
call <巨集名>
當自動巨集被觸發後,呼叫巨集 <巨集名>。
call {
<指示>
}
當自動巨集被觸發後,直接執行 <指示>。
orphan <方法>
設定如何處理 孤兒 巨集的 <方法>。
自動巨集範例
範例:
automacro checkshop {
location prontera
soldout >= 3
delay 60
call reopenshop
}
macro reopenshop {
do closeshop
}
本自動巨集會在你開設露店於普隆德拉且有三個或更多個商品項目被賣光時觸發。當觸發後,它會等一分鐘然後呼叫巨集 "reopenshop" 來關閉你的露店。假如你有設定 shopAuto_open 或 autoshop 為 1 的話,它會在過一陣子後重新開設露店。
註解
巨集檔案允許有註解,即可被巨集 plugin 忽略的文字行。行首以 # 開頭的文字行會被當做是註解。
範例:
# 本行為註解行
孤兒巨集
孤兒(沒人管理的)巨集有可能發生──舉個例來說,當巨集在跑的時候使用了 ai clear 指令──這時該巨集就會變成孤兒巨集。那表示該巨集物件存在但無法繼續,because it requires the AI queue to contain the entry "macro" (or "deal") at the first place. 當 AI 序列被清除時,該"巨集"的 entry 會消失。
在 1.0.2 版之前這個問題必須要經由手動輸入 "macro stop" 來解決。在 1.0.2 及以上的版本你可以選擇應該要用什麼機制來解決此爭議。有三個方法可使用:
terminate 中止該巨集(相當於 macro stop)
reregister 重新註冊至 AI 序列,覆蓋其它的 entry。
這表示強迫該巨集繼續執行。
reregister_safe 當 AI 閒置時再重新註冊至 AI 序列。
這表示該巨集會在所有其它工作項目做完後繼續。
待辦事項/已知 bug/已知限制
■自動巨集的 console 觸發檢查功能會忽略以下的定義域:macro 與 cvsdebug。
■請勿在關鍵字參數中使用右括號 ")",除非它代表一個參數結尾要用到的右括號。舉例來說:@random ("foo", "bar", "@eval (4 + 5)", "yatta") 是可允許的,@random ("foo", "bar", ":-)", "yatta") 是不允許的。
■若 macros.txt 中的第一個區塊無法執行的話,請跳過 macros.txt 中的第一行,改由第二行開始撰寫巨集。第一行可加上 "#####" 來表示此行為註解行。
假如有任何的 bug,請回報它們給我。使用責任自負,我將不會給予以上所述的任何保證。所以假如以上所舉的例子讓你不小心買了 10,000 支笨拙短劍,我不會對此負責(這不太可能會發生,但仍須謹慎..^^)。希望就這些了。祝你玩得愉快。
全站熱搜
留言列表