所謂的巨集就是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
可列出所有有效的巨集。
中止目前的巨集。
暫停目前正在執行中的巨集。
繼續已被暫停的巨集。
顯示版本號碼。
重設所有只執行一次 (run-once) 的自動巨集或重設指定的自動巨集 <name>。
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 佇列的指令是不被允許使用的。
最後,請閱讀此 佈告。它們可能包含一些實用的例子。
假如你想要在你的巨集裡使用 openkore 的指令,那麼請閱讀相關的 console 指令。注意有些像是操作運用 ai 佇列的指令是不被允許使用的。
最後,請閱讀此 佈告。它們可能包含一些實用的例子。
macro foo {
do this..
and that..
yattayatta..
}
理論上,你可以在巨集裡使用任何 console 端的指令。我用這個 plugin 來測試購買銀箭矢、與 NPC 交談和對其他玩家發密語。懶人們可以用這個 plugin 來完成天津通行證或其它諸如此類的任務。
讓 openkore 執行 <指令>。
範例:
macro foo {
do move 123 234 prontera
do sit
do c "hello world"
}
送出 <文字> 至 console 端。
範例:
macro foo {
log 本行記錄一串文字至 console 端。
log All your base are belong to us!
}
暫停 1 或 <n> 秒。
範例:
macro foo {
log 我在這裡,然後...
pause 10
log 現在我在這裡了。
}
呼叫巨集 <巨集名> [<n> 次]。當 <巨集名> 結束後,當前的巨集會繼續執行。
重新恢復一個已封鎖的自動巨集(有 "只執行一次 (run-once)" 的關鍵字或由 "lock" 封鎖住)或使用 release all 重新恢復所有的自動巨集。
封鎖一個自動巨集並取消它的觸發條件的檢驗。
立刻終結目前正在跑的巨集。
設定巨集的特徵為:
- orphan method
- macro_delay timeout
- overrideAI [0|1]
- repeat times
- exclusive [0|1]
請參見 自動巨集 這一節。
你可以定義與運行自己的變數。
要設定一個變數請用 $variable = value,要呼叫此數值請使用 $variable。
使用 $variable++ 或 $variable-- 來增加或減少變數值是可允許的。
使用 @eval 來做計算。要提取以逗號分隔的項目的第一項的話請使用
要設定一個變數請用 $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
location not prontera
當你不在吉芬也不在中央的時候會觸發。
mapchange (<地圖名>|any) [, ...]
當地圖改變至 <地圖名> 時會觸發。假如參數為 any 的話那麼只要地圖有任何更換就會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
多行之間是以 AND 條件來處理。
當你的氣球數符合 <條件> <數量> 時會觸發。
多行之間是以 AND 條件來處理。
多行之間是以 AND 條件來處理。
多行之間是以 AND 條件來處理。
當你的金錢數符合 <條件> <數量> 時會觸發。
多行之間是以 AND 條件來處理。
當你的露店中已賣出的商品槽數符合 <條件> <商品槽數> 時會觸發。
多行之間是以 AND 條件來處理。
status [not] <status> [, ...]
當你(不)為狀態 <status> 時會觸發。
"死亡 (dead)" 與 "禁言 (muted)" 狀態已被附加支援。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
當你擁有 <條件> <數量> 的 <物品> 在你的物品欄時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
當你擁有 <條件> <數量> 的 <物品> 在你的倉庫欄時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
當你擁有 <條件> <數量> 的 <物品> 在你的手推車欄時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
當你擁有 <條件> <數量> 的 <物品> 在你的露店欄時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
當你的 base 等級符合 <條件> <等級> 時會觸發。
多行之間是以 AND 條件來處理。
當你的 job 等級符合 <條件> <等級> 時會觸發。
多行之間是以 AND 條件來處理。
class <job>
當你的職業是 <job> 時會觸發。
spell <spell> [, ...]
當有人施放法術 <spell> 在你身上或你位於該法術範圍時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
monster <怪物名> [, ...]
當怪物 <怪物名> 在附近時會觸發。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
notMonster <怪物名> [, ...]
當某個不在列表之中的怪物出現時會觸發。
以逗號分隔的參數是以 AND 條件來處理。
在主動怪有 <數目> 隻時會觸發。
多行之間是以 AND 條件來處理。
當玩家 <玩家名> 在視野範圍中或在 <距離> 格數範圍內時會觸發。
多行之間是以 AND 條件來處理。
equipped [<slot>] (<item>|none) [, ...]
當物品 <item> 或 沒有物品(none) 被裝備在裝備槽 [<slot>] 中時會觸發。
裝備槽可為 topHead、midHead、lowHead、leftHand、rightHand、robe、armor、shoes、leftAccessory、rightAccessory 與 arrow。
以逗號分隔的參數是以 OR 條件來處理。
多行之間是以 AND 條件來處理。
當 <變數> 未設定(unset) 或符合 <條件> <數值> 時會觸發。
多行之間是以 AND 條件來處理。
當 <巢狀變數> 未設定(unset) 或符合 <條件> <數值> 時會觸發。
多行之間是以 AND 條件來處理。
當 <文字> 在 console 端被接收到或接收到的文字符合 <常規表示式> 時會觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
當 <文字> 經由 <玩家名> 密語給你時或該文字符合 <常規表示式> 時會被觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
當公頻訊息 [在 <距離> 範圍內] 被接收到且它的內容是 <文字> 或符合 <常規表示式> 時會被觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
當 <文字> 經由隊頻被接收到或該文字符合 <常規表示式> 時會被觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
當 <文字> 經由公會頻被接收到或該文字符合 <常規表示式> 時會被觸發。
開關 i 表示該 <常規表示式> 不分大小寫。
hook <hookname>
當 openkore 呼叫 <hookname> 時會被觸發。
save <hash key>
(用來與 hook 連接)
run-once (0|1)
當設為 1 時該自動巨集會在觸發後失效(只觸發一次,之後便不再觸發)。
overrideAI (0|1)
當設為 1 時該巨集會忽略 openkore 的 AI。這表示巨集不會暫停在 "人物移動" 或 "死亡狀態" 時。
delay <n>
在呼叫下一個巨集前等待 <n> 秒。
timeout <n>
在同一個自動巨集被觸發過後等待至少 <n> 秒才可再度被觸發。
macro_delay <n>
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 及以上的版本你可以選擇應該要用什麼機制來解決此爭議。有三個方法可使用:
在 1.0.2 版之前這個問題必須要經由手動輸入 "macro stop" 來解決。在 1.0.2 及以上的版本你可以選擇應該要用什麼機制來解決此爭議。有三個方法可使用:
terminate | 中止該巨集(相當於 macro stop) |
reregister | 重新註冊至 AI 序列,覆蓋其它的 entry。 這表示強迫該巨集繼續執行。 |
reregister_safe | 當 AI 閒置時再重新註冊至 AI 序列。 這表示該巨集會在所有其它工作項目做完後繼續。 |
- 自動巨集的 console 觸發檢查功能會忽略以下的定義域:macro 與 cvsdebug。
- 請勿在關鍵字參數中使用右括號 ")",除非它代表一個參數結尾要用到的右括號。舉例來說:@random ("foo", "bar", "@eval (4 + 5)", "yatta") 是可允許的,@random ("foo", "bar", ":-)", "yatta") 是不允許的。
- 若 macros.txt 中的第一個區塊無法執行的話,請跳過 macros.txt 中的第一行,改由第二行開始撰寫巨集。第一行可加上 "#####" 來表示此行為註解行。
假如有任何的 bug,請回報它們給我。使用責任自負,我將不會給予以上所述的任何保證。所以假如以上所舉的例子讓你不小心買了 10,000 支笨拙短劍,我不會對此負責(這不太可能會發生,但仍須謹慎..^^)。希望就這些了。祝你玩得愉快。
常見問題
確認你已經把你的巨集指令存入 macros.txt。Windows 檔案總管有時候會隱藏已知的副檔名像是 txt,所以檢查看看你有沒有不小心把你的檔案命名成 macros.txt.txt。另外有些人可能有這個問題:若只有 macros.txt 中的第一個區塊無法執行的話,請跳過 macros.txt 中的第一行,改由第二行開始撰寫巨集。第一行可加上 "#####" 來表示此行為註解行。
1.0.0 版的巨集 plugin 語法有變動。請閱讀文件以學習相關的新語法。大部份的 0.8.x 與 0.9.x 的巨集指令可以使用 mconv.pl 來變換成 1.0.0 的語法。
- 假如你正在使用 OpenKore,請更新到 OpenKore 1.9.1 或更高的版本。
- 假如你正在使用 VisualKore,請更新到 VisualKore 1.9.2 或更高的版本。
巨集 plugin 從 1.3.0開始已不再支援 OpenKore/VisualKore 1.6.x 的版本了。
請從 論壇 尋找。假如你無法找到你想要的巨集,那就自己寫一個吧。不要當伸手牌。
我有一個自動巨集可用來檢查我的道具欄/手推車內某個物品的數量低於一個給定值或等於零(例如 inventory "紅色藥水" <= 30)但那個自動巨集在地圖轉換時也會觸發。為什麼會這樣以及我應該怎麼辦?
當你正在地圖轉換時所有的物品會從你的道具欄暫時消失一小段很短的時間。有時正式的主程式也會有這種情形發生。要避免這種情形發生,可對某個總是會在你身上的一個物品加入一個額外的判定,像是 inventory "傑勒比結晶" > 0。
指令傳送得太快了。請新增 macro_delay 選項,或在你的 do 指令與指令之間插入 pause。
最新的巨集 plugin 釋出後,後續可能還會有部分的 OpenKore 程式碼會有所改變。因此要先更新你的 OpenKore 安裝程序。接下來,取得最新的 SVN 版巨集 plugin 來安裝。假如仍沒有幫助的話,試著搜尋看看論壇裡有沒有特別的錯誤訊息的描述的關鍵字以尋求解決方法,請不要只搜尋像 "Undefined subroutine" 或其它太普遍的錯誤訊息字串。仍然無法運作的話,才在版上發文詢求支援,但記得使用適當的主題!