2015年5月9日 星期六

巨集必備資訊

※ 以下轉自OPTW社 ※


#內容快搜:

1、常用的語法

2、自動巨集的觸發條件

3、版本內所預設的變數

4、觸發條件下的變數

5、版本內所預設的函數


#####################################################################################################

巨集分為一般巨集(macro)與自動巨集(automacro)

macro 與之後automacro要給一個名稱,為此巨集設定的名稱之後並以{}之內的內容為巨集所執行的內容


一般巨集(macro)

在黑窗下只要輸入macro XXX(XXX為你巨集自行設定的名稱)就會執行該巨集

例:
macro foo {
        log hello
}
在黑窗下按下macro foo結果會顯示
[macro log] hello

自動巨集(automacro)

需先有一個觸發的條件來自動觸發巨集,而非手動去觸發巨集,之後執行(呼叫)巨集內容
有兩種寫法
可以將呼叫的內容寫在call {}之內
或是在call之後直接呼叫別的一般巨集

例:
automacro aaa {
        console /123/
        call {
                log hello
        }
}

automacro aaa {
        console /123/
        call foo
}
macro foo {
        log hello
}
以上兩種寫法結果會相同
此時只要黑窗上出現123
就會自動觸發automacro aaa
而結果會顯示
[macro log] hello

#####################################################################################################

至於巨集內容
會一行一行逐行的進行
所以要先了解巨集的語言語法
以下稍為解釋一些常用的語言

1、常用的語法

do <command> 
執行 openkore 的 <指令> ,可以在黑窗下輸入指令 help 查詢所有指令

log <text>
顯示 <文字> 於黑窗

pause [<n>] 
暫停[秒]

call <macroname> 
呼叫 macro

release (<name> | all) 
重新啟用指定名稱automacro或全部自動巨集

lock (<name> | all) 
鎖定指定名稱automacro或全部自動巨集,可以使用 release 解除鎖定

stop 
停止 macro或automacro

if ()
假如判別式
用來設定兩種以上的條件,如果符合其中一種,執行A
若不符合其條件,執行B
可以兩種方式執行

1.
if () goto abc
:abc

例1.
automacro b {
        console /(.*) \((.*)\) 向您要求一個交易/
        call {
                $p1 = $.lastMatch1
                if ($p1 == 鋼鐵人) goto cc
                do conf dealAuto 3
                stop
                :cc
                do deal no
        }
}

2.
if () call macro

例2.
automacro b {
        console /(.*) \((.*)\) 向您要求一個交易/
        call {
                $p1 = $.lastMatch1
                if ($p1 = 鋼鐵人) call cc
                do conf dealAuto 3
        }
}
macro cc {
        do deal no
        stop
}

以上兩個結果是一樣的
以下是以新版本寫法

3.
if () { } else { }
假如成立就怎樣 否則就那樣

例3.
automacro b {
        console /(.*) \((.*)\) 向您要求一個交易/
        call {
                $p1 = $.lastMatch1
                if ($p1 == 鋼鐵人) {
                        do deal no
                } else {
                        do conf dealAuto 3
                }
        }
}

結果還是一樣~但比較容易看得懂~

4. 
if () { } elsif () { } 
假如成立就怎樣 否則再假如那樣~

例4.
automacro b {
        console /(.*) \((.*)\) 向您要求一個交易/
        call {
                $p1 = $.lastMatch1
                if ($p1 == 鋼鐵人) {
                        do deal no
                } elsif ($p1 == 綠巨人) {
                        do conf dealAuto 3
                }
        }
}

這樣假如是鋼鐵人成立 ~ 綠巨人就不再執行判斷

5.
if () { } elsif () { } else { }
假如成立就怎樣 否則再假如那樣 否則就...

例5.
automacro b {
        console /(.*) \((.*)\) 向您要求一個交易/
        call {
                $p1 = $.lastMatch1
                if ($p1 == 鋼鐵人) {
                        do deal no
                } elsif ($p1 == 綠巨人) {
                        do deal no
                } else {
                        do conf dealAuto 3
                }
        }
}

到這裡應該都了解了吧!!


另外,if可以使用單一判斷式
if (arg1 <Conditions> arg2) (goto <label> | call <macro> [<n>] | stop)

也可以多重判斷
用 || (或) 擇一判斷; 
if (arg1 <Conditions> arg2 || arg3 <Conditions> arg4) (goto <label> | call <macro> <n> | stop)

或可以用 && (並且) 雙重條件都成立時來判斷; 
if (arg1 <Conditions> arg2 && arg3 <Conditions> arg4) (goto <label> | call <macro> <n> | stop)

或者 || 與 && 並用

#################################################################################

2、自動巨集的觸發條件

console ("<text>" | /<regexp>/)
只要與console之後的文字或字串相符的字串出現,就可以觸發該自動巨集,其中可以以(.*)代替任何字串

spell [party] <spell> [, ...] 
只要與spell之後的文字或字串相符的對你施放技能,就可以觸發該自動巨集,

pm ("<text>" | /<regexp>/) 
只要與pm之後的文字或字串相符的密語出現,就可以觸發該自動巨集,

pubm ("<text>" | /<regexp>/) [, <distance>] 
只要與pubm之後的文字或字串相符的公開頻道出現,就可以觸發該自動巨集,可以用 [, <distance>]限定其玩家與你的的距離 

party ("<text>" | /<regexp>/) 
只要與party之後的文字或字串相符的公開頻道出現,就可以觸發該自動巨集,

guild ("<text>" | /<regexp>/)
只要與guild之後的文字或字串相符的公開頻道出現,就可以觸發該自動巨集,

map <mapname> 
只要BOT當前在此地圖,就可以觸發該自動巨集,

location [not] <mapname [<x1> <y1> [<x2> <y2>]] [, ...] 
只要BOT當前在(或加上not不在)此地圖座標,就可以觸發該自動巨集,

mapchange ( <mapname> | any | * ) [, ...] 
只要BOT當前從此地圖改變地方,就可以觸發該自動巨集,

playerguild (<guild list> [, ...] | <guild.txt>) [, <distance>] 
當出現此語法所設定公會名稱之玩家,就可以觸發該自動巨集,可以用 [, <distance>]限定其玩家與你的的距離 

areaSpell <spell> [<distance>] 
只要與areaSpell之後的文字或字串相符的對地區施放技能,就可以觸發該自動巨集,

hp <condition> <amount>[%] 
以指定hp觸發自動巨集,可以為數字或%,並可以用AND多重條件觸發

sp <condition> <amount>[%] 
以指定sp觸發自動巨集,可以為數字或%,並可以用AND多重條件觸發

spirit <condition> <amount> 
以指定氣彈數觸發自動巨集,並可以用AND多重條件觸發

weight <condition> <amount>[%] 
以指定負重觸發自動巨集,可以為數字或%

cartweight <condition> <amount>[%] 
以指定手推車負重觸發自動巨集,可以為數字或%

zeny <condition> <amount>
以指定金錢觸發自動巨集,並可以用AND多重條件觸發

soldout <condition> <slots>
以指定賣出狀況觸發自動巨集,並可以用AND多重條件觸發 

status [not] <status> [, ...]
以指定狀況(死亡或禁言)觸發自動巨集,並可以用AND多重條件觸發

inventory "<item>" <condition> <amount> 
以指定身上物品數量觸發自動巨集,可以以逗點寫下多個 物品條件,並可以用AND多重條件觸發

storage "<item>" <condition> <amount> [, ...] 
以指定倉庫物品數量觸發自動巨集,可以以逗點寫多個物品條件,並可以用AND多重條件觸發

cart "<item>" <condition> <amount> [, ...] 
以指定手推車物品數量觸發自動巨集,可以以逗點寫下多個物品條件,並可以用AND多重條件觸發 

shop "<item>" <condition> <amount> [, ...] 
以指定商店物品數量觸發自動巨集,可以以逗點寫下多個物品條件,並可以用AND多重條件觸發 

base <condition> <level> 
以指定基本等級觸發自動巨集,並可以用AND多重條件觸發 

job <condition> <level> 
以指定職業等級觸發自動巨集,並可以用AND多重條件觸發 

class <job> 
以指定職業觸發自動巨集,並可以用AND多重條件觸發 

monster [not] <monster(s) name> <condition> [<distance>] 
以指定怪物觸發自動巨集,可以以逗點寫下多個物品條件,並可以用AND多重條件觸發,並可設與怪物的限定距離

aggressives <condition> <number>
以指定被攻擊之數量狀況觸發自動巨集,並可以用AND多重條件觸發 

player ("<player name>" | /<regexp>/) [, <distance> ] 
以指定玩家名稱出現觸發自動巨集,並可以用AND多重條件觸發 

equipped [<slot>] {<item> | none} [, [<slot>] {<item> | none} [, ...]] 
以指定裝備數量觸發自動巨集,可以以逗點寫下多個裝備條件,並可以用AND多重條件觸發 

var <variable> (unset | <condition> <value>) 
Triggers when <variable> is either unset or matches <condition> <value>. Multiple lines are treated as AND conditions. 

varvar <nested variable> (unset | <condition> <value>) 
Triggers when <nested variable> is either unset or matches <condition> <value>. Multiple lines are treated as AND conditions. 

whenGround [not] <spell>
Triggers when we are in the effect of ground status. Comma- separated list will be treated as OR condition 

localtime <condition> <time> 
以CPU的時間觸發自動巨集. Time 格式為 24h. 如: 11:22:33 (hour:minute:second),並可以用AND多重條件觸發 

eval <perl expression> 
Triggers when <perl expression> is true.


特別的條件設定

overrideAI [0|1] 
優先於 openkore 的 AI [0| 1] 
macro_delay <n>
每一行指令延遲的時間(秒) 如同每一行指令間加上 pause 避免指令發送太快斷線
exclusive [0|1]
唯一性[0 | 1] 可以避免被其它巨集中斷執行
orphan method
單一的模式
run-once (0 | 1) 
執行鎖定觸發的automacro,即執行過後不再觸發,可用release解除鎖定
delay <n>
巨集觸發後延遲 n 秒再呼叫對應的 macro
timeout <n>
等待n秒再繼續執行automacro
priority <num>
優先權設定(沒有設定時為0為最優先)
set <variable> <value>
設定變數的設定值 , 在一個自動巨集中要設定多項變數可分行設定

#####################################################################################################

而撰寫巨集中
需要很多變數來定義,所以以下做個簡單說明

$變數
用等於(=)來定義,=左右各一個空格。
變數的設定只要不是內定的變數,可以使用任何名稱
其等於右邊的內容可以是數字或文字
你可以定義動態或嵌入式的變數。

macro foo {
        $aaa = Camila
        ${$aaa} = Brazil 
        # 註: $name 目前是Camila
        log $aaa lives on ${$aaa}
}
$aaa就是你設定的變數
以上例子中
$aaa 就變成 Camila
而${$aaa}也是$Camila1u並且變成Brazil
在黑窗下按下macro foo結果會顯示
[macro log] 
Camila lives on Brazil

在變數前加反鈄線 \
會把此變數當做文字

macro foo {
        $n = 123
        log \$n is $n
}

在黑窗下按下macro foo結果會顯示
[macro log] $n is 123

變數不能直接計算,只能用指令置换演算,因此用 @eval() 來演算。
而 @eval() 中的計算不能用刮號,所以裡面有複雜運算時,要用多重 @eval() 來表示


macro math {
        $num = 10
        $num2 = 5
        $result1 = @eval($num+$num2)
        $result2 = @eval(2*@eval($num+$num2))
        log sum of $num and $num2 is $result1
        log 2*$result1 is $result2
}
結果會顯示
log sum of 10 and 5 is 15
log 2*15 is 30


3、版本內所預設的變數
這些好用的預設變數能瞭解,對寫巨集有極大的幫助。

$.map - BOT目前所在的地圖 如(payon)
$.pos - BOT目前所在的座標 如(123 234) 
$.time - BOT目前的時間如同unix時間郵戳,(其實我不太明白,有可能是自 1970-01-01 00:00:00 以來的秒數)("1131116304"為2005/11/4 14:58:24) 
$.datetime - BOT目前的日期與時間(week month date hh:mm:ss yyyy) ("Fri Nov 4 15:59:36 2005") 
$.hour - BOT目前的小時時間(24h制) 
$.minute - BOT目前的分時間 
$.second - BOT目前的秒時間
$.hp - BOT目前的hp 
$.sp - BOT目前的sp 
$.lvl - BOT目前的基本等級 
$.joblvl - BOT目前的JOB等級
$.spirits - BOT目前的靈魂(氣)數。武憎或其他相關職業才有用
$.zeny - BOT目前的錢zeny 
$.status - BOT目前的素質狀態以逗號列表區分 
$.paramN - command line parameters (see Commands) 
$.caller - name of the last triggered automacro 
$.weight - BOT目前的負重
$.maxweight - BOT目前的總負重

#####################################################################################################

4、觸發條件下的變數

console 觸發條件下用的變數
$.lastLogMsg - 上一個觸發自動巨集的關鍵字串
$.lastMatchN - 回傳觸發自動巨集的關鍵字中第N個相聯的字串
一般與Console聯用,並要使用到(.*)的撰寫方式,以下有相關舉例說明。

console是最常使用的觸發條件

以下為一個好用的console範例
automacro b {
        console /(.*) \((.*)\) 向您要求一個交易/
        call {
                do deal
                pause 15
                #15秒內不動作取消交易
                do deal no
        }
}

automacro c { 
        console /(.*) 加入物品以交易: (.*) x (.*)/
        call {
                $p1 = $.lastMatch1
                $i1 = $.lastMatch2
                $m1 = $.lastMatch3
                $bzz = @eval($m1*480)
                if ($p1 = 某人的名字) goto aaa
                if ($i1 = 藍色魔力礦石) goto bbb
                do pm $p1 給錯了!!只交易藍礦,其餘物品不收
                do deal no
                stop
        :aaa
                c 你是某人的名字,我不跟你交易!!
                do deal no
                stop
        :bbb
                do deal add z $bzz
                do deal
                do conf dealAuto 3
                pause 15
                do deal no 
                #15秒內未完成交易者取消交易
                do conf dealAuto 0
                stop
        }
}
automacro c 中 
$p1是第一個 (.*), 是玩家的名字,
$i1是第二個 (.*), 是交易的物品,
$m1是第三個 (.*), 是交易的物品的數量,
此巨集可以讓你跟某人的名字以外的人,以一顆480的價錢交易藍礦

spell 觸發條件下用的變數
$.caster - 回傳對你或你的隊友施展觸發自動巨集技能的玩家或怪物
$.casterName - 回傳對你或你的隊友施展觸發自動巨集技能的玩家或怪物的名稱
$.casterID - 回傳對你或你的隊友施展觸發自動巨集技能的玩家或怪物的ID
$.casterPos - 回傳對你或你的隊友施展觸發自動巨集技能的玩家或怪物的座標
$.casterSkill - 回傳對你或你的隊友施展觸發自動巨集技能的玩家或怪物的技能名稱
$.casterTarget - 回傳對你或你的隊友施展觸發自動巨集技能的玩家或怪物所施放技能的目標
$.casterTargetName - 回傳對你或你的隊友施展觸發自動巨集技能的玩家或怪物所施放技能的目標名稱
$.casterDist - 回傳對你或你的隊友施展觸發自動巨集技能的玩家或怪物距離

pm 觸發條件下用的變數
$.lastpm - 回傳上一個對你密語的玩家
$.lastpmMsg - 回傳對你密語的內容

pubm觸發條件下用的變數
$.lastpub - 回傳上一個公開頻道說話的玩家
$.lastpubMsg - 回傳上一個公開頻道說話的內容

party 觸發條件下用的變數
$.lastparty - 回傳上一個隊伍頻道說話的玩家
$.lastpartyMsg - 回傳上一個隊伍頻道說話的內容

guild 觸發條件下用的變數
$.lastguild - 回傳上一個公會頻道說話的玩家
$.lastguildMsg - 回傳上一個公會頻道說話的內容

playerguild 觸發條件下用的變數
$.lastPlayerID - 回傳上一個playerguild觸發者的ID
$.lastGuildName - 回傳上一個playerguild觸發者的公會名稱
$.lastGuildNameBinID - 回傳上一個playerguild觸發者的ID 
$.lastGuildNameBinIDDist - 回傳上一個playerguild觸發者的與你的距離
$.lastGuildNameBinIDName - 回傳上一個playerguild觸發者的名字
$.lastGuildNameBinIDJobName - 回傳上一個playerguild觸發者的職業

areaSpell 觸發條件下用的變數
$.areaName - 回傳上一個areaSpell觸發的名稱
$.areaActor - 回傳上一個areaSpell觸發的來源(玩家或怪物)
$.areaSourceName - 回傳上一個areaSpell觸發的來源名稱
$.areaSourceID - 回傳上一個areaSpell觸發的來源ID
$.areaPos - 回傳上一個areaSpell觸發的來源位置座標(ex: 123 123 payon)
$.areaDist - 回傳上一個areaSpell觸發的來源位置座標與你的距離


monster 觸發條件下用的變數
$.lastMonster - 回傳上一個monster觸發的怪物名稱
$.lastMonsterPos - 回傳上一個monster觸發的怪物座標 Ex: x, y map_name 
$.lastMonsterDist - 回傳上一個monster觸發的怪物距離
$.lastMonsterID - 回傳上一個monster觸發的怪物距離ID
$.lastMonsterCount - 風險點數 (available only for monster syntax)

#####################################################################################################

5、版本內所預設的函數
巨集裡有一些預設的函數,可以用來呼叫出一些特定數值或名稱

@npc (<x> <y> | /regexp/i | "<name>")
回傳在<x> <y>座標NPC的編號,如果-1就是找不到
@inventory (<item>)
回傳含有撰寫字樣物品的編號,如果-1就是找不到,如鋁,會把鋁原石跟鋁都算在內
@Inventory (<item>)
回傳有撰寫字樣物品一模一樣的編號,如果-1就是找不到 
@invamount (<item>)
回傳在含有撰寫字樣物品的數量,如果-1就是找不到,如鋁,會把鋁原石跟鋁都算在內
@cart (<item>)
回傳在手推車裡含有撰寫字樣物品的編號,如果-1就是找不到
@Cart (<item>)
回傳在手推車裡有撰寫字樣物品一模一樣的編號,如果-1就是找不到
@cartamount (<item>)
回傳在手推車裡含有撰寫字樣物品的數量,如果-1就是找不到
@storage (<item>)
回傳在倉庫裡含有撰寫字樣物品的編號,如果-1就是找不到
@Storage (<item>)
回傳在倉庫裡有撰寫字樣物品一模一樣的編號,如果-1就是找不到,如鋁,會把鋁原石跟鋁都算在內
@storamount (<item>)
回傳在倉庫裡含有撰寫字樣物品的編號,如果-1就是找不到
@player (<name>)
回傳指定玩家名稱的編號,如果-1就是找不到
@monster (<name|ID>)
回傳指定怪物名稱的編號,如果-1就是找不到
@vender (<name>)
回傳指定賣家名稱的編號,如果-1就是找不到
@store (<name>)
回傳指定商店名稱的編號,如果-1就是找不到
@shopamount (<item>)
回傳指定商店物品的數量,如果-1就是找不到
@random ("<argument1>", "<argument2>", ...)
回傳隨機給一個在@random之後所寫下的數字
@rand (<n>, <m>)
回傳隨機給一個在@random之後n與m之間的數字
@eval (<argument>)
回傳@eval內容計算的數字
@arg ("<argument>", <n>)
回傳@arg參數的第n個字,如果沒有會顯示空白
@config (<variable>)
回傳@config <variable>變數的數值
@venderitem (<name>)
回傳尋找賣家賣的物品的編號, 
@venderprice (<indexID>)
回傳尋找賣家賣的物品的價錢
@nick (<word>)
Escapes all the regexp metacharacters and some of the perl special characters with \ (a 
backslash). Especially for player's name.