並且需要一點 EZS 的寫作概念,才有辦法自己寫出一個完整的程式。
因為伐木的路線上,每棵樹木的位置都不盡相同,
這篇文章的內容將會告訴你應該如何做,但是還是必須自己寫。
觀念篇
伐木的流程不外乎走預定的路線,伐木後,把木頭拿回家放,
中間的過程中可能會遇到樹妖,當血減少的時候,
表示被攻擊了,這時候必須停下伐木的動作,
換上武器、盾牌,開始補血,發覺滿血過了一會兒後,
表示可能樹妖暫時遠離或被打死了,此時繼續伐木的動作,
最後把木頭再拿回家的時候,必須同時補充繃帶,
把用過的繃帶和木頭一起放回家裡去~
開始進入主題,要做到上述全自動的伐木Macro必須注意的幾個重點,
包含了伐木的路線安排、物資的存取以及遇到樹妖的對應之道。
此外,為了伐木的效率,偵測是否已經沒有木頭也將是重點之一。
地點選擇
伐木的地點一定要選擇樹木密集的地方,才不需要繞太遠,
至於是否要在城市邊緣則見仁見智,在城市邊緣伐木若不小心死了,
回城市復活比較快,但是相對的人也比較多,
有可能其他人也在此伐木,或遇到有心人破壞的。
而在偏遠的郊區則優缺點剛好相反,這部分並沒有特別的建議。
伐木路線
我的路線安排方式是走一小圈一小圈、不同的伐木路線,
以自己住家為起點,安排一圈約 30 到 40 棵樹木的小路線,
伐完一圈就回家把木頭放到寶箱內,
當你技能低的時候,伐木一次得到 2 根木頭,
所以可以設定對同一棵樹木多砍幾次,讓你回家前剛好包包滿即可,
當你技能高的時候,每棵樹木砍一次即可。

[圖一]走小圈的路線規劃方式
走小圈的方式有些幾個優點,
你可以在一開始的時候先寫一小圈試試,
沒問題的話,可以寫個三四圈就開始macro了,
等到技能越來越高,再慢慢增加新的路線,
甚至當你發現有人蓋屋在你的某一條路線上時,
直接把這條路線去掉即可,可說是蠻有彈性的。
路線安排上可以離家近,也可以離家遠,各有優缺點,
離家近的話,走一圈的速度比較快,比較有效率,
離家遠的話,回家放木頭的時候比較不會被樹妖所干擾,
不然當你家前面都檔滿了樹妖,木頭可能都會抓到樹妖的身上去 @@
在伐木路線上,我會儘量選擇走一小段之後,
可以同時砍三到六棵木頭的停頓點,請看下面圖示:

[圖二]路線上的停頓點示意圖
此外,為了增加伐木的效率,可以用跑步來取代走路的行進方式,
只要把「勾選後,您的人物會以跑步方式行進移動」勾選即可。

[圖三]勾選以跑步方式行進移動
物資存取
伐木當然要把木頭留下來,因為大量的木頭可是蠻值錢的,
所以最基本的方式,就是在屋子前面放個上鎖寶箱,
每伐完一圈後,就回家把背包中的木頭放進去。
為了每次都不讓背包的位置跑掉,
可以先用背包某一點的顏色值來偵測是否跑掉,
若背包跑掉了,必須先關閉,然後再開啟,
背包就會回到正確的位置上,
此時再去做拖曳木頭的動作即可。
這部分必須配合 UO 的設定,把「排列介面視窗,而不是將其堆疊」
的選項取消勾選,並且分別設定開關背包的熱鍵。

[圖四]取消「排列介面視窗,而不是將其堆疊」
而繃帶和用過的繃帶也必須同時做數量的調整,
繃帶用過後數量會減少,此時可以用 UOA 的 User1 來判斷需要補充多少,
然後由地上(我是把繃帶直接放地上,要不要加上上鎖則看你自己囉)把繃帶
放到自己身上,而用過的繃帶則可全部丟入寶箱中~

[圖五]屋前的配置,寶箱和繃帶
遇到樹妖
利用UOA來判斷當 Hits 少於 STR 時,則跳至補血部分,
此時暫停伐木,原地立即換上盾牌和武器,並且每隔四秒補一次血,
若樹妖靠近攻擊時,我們會自動反擊,
但是樹妖經常遠遠的施放魔法,所以能打死樹妖的機率不高,
這部分能自保即可,而且所需的戰鬥及補血技能不需要很高,
在下戰技和醫療都只有50出頭,面對三、四隻樹妖的圍攻時,
Macro 補血也還游刃有餘呢。
只是遇到樹妖時,並非是死活的問題,而是技能被打斷的問題,
技能使用中被打斷則不會提升技能,所以附近出現多隻樹妖時,
經常伐木就會被中斷~若不能自己手動清理,
最好是能找人幫忙清理,否則只好靠運氣打死他或等他消失吧~
等滿血經過一會兒後,即可繼續伐木的動作。
實作篇
瞭解了伐木的流程後,就可以開始進行程式的部分了。
這個Script除了主程式是路線的部分需要自己來做之外,
副程式有三個,包含了(1)伐木、(2)放物資存放、(3)補血,
都可以稍做修改後套用。
首先看伐木的主程式結構如下:
代碼: 選擇全部
On Hits<STR Jump Heal
//第一圈
Goto 1234,2234 //往某一定點前進
Pos1= 9044307 //指定要砍木頭的點,請依實際樹木的位置修改
Call LJ //呼叫砍木頭的副函式
Pos1= 14156046 //指定下一棵
Call LJ //砍
Pos1= 7856322 //指定下一棵
Call LJ //砍
Goto 3234,4234 //繼續往某一定點前進
Pos1= 7930215
Call LJ
Pos1= 14090687
Call LJ
... //依此要領繼續砍
...
Goto 1000,2000 //走回家
Call Put //呼叫存放物資的副函式
//第二圈
...
...
//第三圈...依序不斷,寫個十圈吧
//若 Goto 無法使用,則要檢查一下 Home、End、PgUp、PgDn
//是否有被指定為其他用途的熱鍵,以及 UOP.dll 版本是否正確。
然後就是開始路線的走走、停停、砍砍~
走到定點後停下,然後指定某個樹木的點,設定為 Pos1 之後,
跳到伐木副程式,副程式會抓這個點來砍。
代碼: 選擇全部
// Lumberjacking, use LastObject on Pos1
LJ:
Repeat Var7 //對同一樹木砍的次數(可自行修改)
Sendmacro(16) //使用斧頭的熱鍵
Delay Var4 //延遲約一秒
Left Click Pos1 //點 Pos1
Delay Var4 //延遲約一秒,等訊息出來
If color[28115000]=Var8 //表示該樹沒有木頭了
Break //跳離次數迴圈
End If
If color[28115000]!=Var8 //該樹有木頭
WaitForWghtChange(Var5) //再延遲個約 11 秒
End If
End Repeat
Return
這部分可以參考在下的拙作「半自動挖礦程式」一篇,
有這部分的詳細說明。
關於我所抓到的顏色 Var8,依 Windows 色階數不同而有所不同,
設定為高彩(16bit)時,Var8=8946824,
設定為全彩(32bit)時,Var8=8421504。
在此補充一點,這篇所提及的程式內容的顏色判斷,
都是在 16bit 的環境下所抓的,各位可參考或自行修改。
此外也看到有人是以日誌所出現的訊息來做顏色的判斷,
這似乎也是個很不錯的方式,各位也可以參考看看。
如此走走、砍砍,走完一圈後,走回家裡,
這時候換呼叫存放物資的副程式,
因為規劃上是一小圈一小圈的走,
所以每走完一圈都會用到這部分的程式,
寫成副程式會比較容易修改。
代碼: 選擇全部
//Put logs into chest
Put:
If Color[1049104]!=2110544 //若背包某一點的顏色不對了
Sendkey(Alt+85) //關包包(UO 內建,需自行設定)
Delay 500
Sendkey(Alt+73) //再開包包(UO 內建)
Delay 1000
End If
//找出木頭所在的點,全部拖到寶箱內
//Pos2 和 Pos3 是背包的左上角和右下角, Pos7 是寶箱位置
If GetColorPos[3167360,pos2,pos3]!=-1
Drag All from GetColorPos[3167360,pos2,pos3] to pos7
Delay 1000
End IF
//ExtVar[2] 是伐木過程有遇到補血的標註,
//若之前沒有補血的過程,就不更動背包的繃帶數量
If ExtVar[2]=1
// 把地上的繃帶解鎖,這部分可選擇性使用,
// 畢竟加上這段後,出錯的機率也會增高
// 不加上去,繃帶會容易被偷~
// Sendmacro(12)
// Delay 1000
// Left Click 14745910
// Delay 1000
//User1 是繃帶的數量
//把身上繃帶數量補足到 200
ExtVar[3]=200-User1
Drag ExtVar[3] From 14745910 To 9306576
Delay 1000
// 地上的繃帶再次上鎖,需配合前面上鎖的那一段
// Sendmacro(12)
// Delay 1000
// Left Click 14745910
// Delay 1000
//把用過的繃帶放到寶箱中
If GetColorPos[13161712,pos2,pos3]!=-1
Drag All from GetColorPos[13161712,pos2,pos3] to pos7
Delay 1000
End IF
End If
ExtVar[2]=0 //補血標註取消
Return
總之就是把木頭放到寶箱內,把身上繃帶補到足夠即可,
只是一些物件的拖拉動作,這部分就不多做解釋了。
最後一段是補血的部分,當你遭受攻擊損血時,
會自動跳到這裡來:
代碼: 選擇全部
//Heal myself
Heal:
Sendmacro(1) //UOA錄製使用盾牌、武器
Delay 500
ExtVar[1]=0 //滿血的次數
ExtVar[2]=1 //補血標註,在存放物資的時候用到
While ExtVar[1]<3 //如果滿血超過3次,就不會繼續補(可自行修改)
If Hits<STR //如果還是損血狀態,就要補血
Sendkey(Alt+77) //Bandage Self 的熱鍵,請自行設定
Delay 4000
ExtVar[1]=0 //滿血次數歸零
Else
Delay 4000
ExtVar[1]=ExtVar[1]+1 //滿血次數加一
End If
WEnd
Sendmacro(16) //補血完畢,使用斧頭的熱鍵
Delay 500
Sendkey(27) //取消目標(ESC)
Resume
若滿血的狀態,一樣延遲四秒,但是會在 ExtVar[1] 紀錄次數,
等滿血的次數超過 3 次(可自行修改),則恢復使用斧頭,繼續伐木。
其實有部分武器也是可以用來伐木的,
如果你身上裝配這樣武器,就可以不需要切換,
這樣在伐木的時候也是裝配盾牌和武器,可以減少損血、增加活命機率,
但是這樣做的話,如果武器在反擊樹妖的過程中不小心損毀的話,
那你也同時失去了伐木的工具囉

心得
比起寫一個全自動的挖礦程式,伐木算是簡單多了,
但是樹妖真的很多~
不過只要身上繃帶數量夠、補血順利,加上沒有人干擾的話,
這個伐木Script也都還可以順利地全自動進行~
也從未發生路線偏移的現象,所以還算蠻穩定的。
目前掉在地上的種子並未判斷並且自動拾起,
砍到黃金木也未判斷並且自動放入寶箱,
這些都是未來可以改進的方向。
--
原文看載於輔助軟體討論版,承蒙版主 Jason 賞識,
本文得以在此佔些篇幅,希望對於伐木新手們能有所幫助。