1 頁 (共 1 頁)

[分享]全自動伐木EZScript

發表於 : 週五 1月 10, 2003 11:24 pm
fatality
這篇所介紹的Script必須用 EZScriptII 以及 UOA 的配合,
並且需要一點 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 賞識,
本文得以在此佔些篇幅,希望對於伐木新手們能有所幫助。