魔獸世界超級助手Lua指令碼語言是本文要介紹的內容,主要是來瞭解魔獸世界的開發語言lua的學習,具體內容來看本文詳解。
Lua的編程結構:
1)Lua的注釋:行注釋標識符"",用來注釋其後的一行內容。多行注釋以"[["表示注釋開始,延續到"]]"結束。
2)Lua的程式:Lua的每一個語句塊都需要end關鍵字進行結尾。控制語句有
- if 條件 then ... elseif 條件 then ... else ... end
- while 條件 do ... end
- for 變數=初值, 終點值, 步進 do ... end
- for 變數1, 變數2, ... 變數n in 表或枚舉函數 do ... end
等模式。
函數以function開始,以end結尾。同時支援類、繼承、私人等物件導向程式設計模式。
注意事項:
1)string庫的string.len(s)函數是計算單位元組長度的,比如雙位元組的一個漢字則長度為2,依次計算類推。
2)table庫的數群組類型元素起點為1,常規語言的元素起點0將被忽視,table.getn()擷取指定數組元素個數以起點1算起。例如a[0]永遠是nil(即null不存在的)。
3)邏輯運算子“and(與)、or(或)、not(非)”;關係運算子“~=(不等於)”;串連運算子“..” 都是有別於或類似於其他語言的,請勿混淆濫用。其中串連符可以直接連接數值、字串、運算式等。
指令碼控制和多指令碼協同:
暫停休眠:sleep(毫秒數)函數
設定定時器:定時器編號 = settimer(毫秒, '函數名')函數
關閉定時器:killtimer(定時器編號)
顯示調試資訊:trace('內容')函數
執行指令碼函數:線程控制代碼, 線程ID = runlua('檔案名稱')
(啟動多指令碼,檔案名稱:相對於助手Scripts目錄)其中多指令碼有設定和擷取公開變數的支援。因為Lua指令碼是不支援多線程的,因此我們用多指令碼即可實現多線程的程式操作模式。
傳回值線程控制代碼整型值,線程ID整型值
設定字串全域變數:setglobalstring('變數名', '變數值')
設定整型全域變數:setglobalint('變數名', 變數值)
設定浮點數全域變數:setglobalfloat('變數名', 變數值)
擷取全域變數:值 = getglobalvar('變數名')
擷取全域變數個數:個數 = getglobalvarcount()
刪除全域變數:removeglobalvar('變數名')
注意:以上變數名最長63位元組,超過部分將被截斷。全域變數是所有LUA指令碼都可以訪問的,所以命名變數名時儘可能複雜,以免衝突投遞線程訊息:是否成功 = postthreadmessage(線程ID, 訊息, 字參, 長參)
線程ID:對應runlua返回的線程ID。
message:訊息ID
wParam:字參
lParam:長參
傳回值:0/1
設定監視線程訊息:setmsgwatch('訊息監視回呼函數名')
注意:此函數必須放在所有代碼的最後,否則其後的代碼將不會被執行
參考格式為:
- function msgwatchfunc(message, wParam, lParam)
- [[message、wParam、lParam分別對應投遞線程訊息函數的訊息, 字參, 長參]]
- …
- end
- setmsgwatch('msgwatchfunc')
檔案與系統功能支援:
ini檔案讀操作:值 = readini('節名', '值名', '檔案名稱')
ini檔案寫操作:writeini('節名', '值名', '值', '檔案名稱')
擷取系統啟動至今的毫秒數:毫秒數 = gettickcount()
傳回值:無符號整形數值
響鈴:beep(頻率, 期間[毫秒])函數
MP3播放:playmp3('mp3或wav檔案路徑')函數
複製文字到剪下板:copytexttoclipboard('要複製的文字內容')函數
視窗控制與進程操作:
助手提供了windows程式視窗與進程操作的眾多函數介面,可以實現絕大多數的windows程式控制和進程操作,此處暫不一一列舉,有興趣的詳細參看助手指令碼編輯器的功能菜單。在這裡我們要特彆強調一下其中2個函數:
用戶端區域座標轉換為螢幕地區座標:x,y = clienttoscreen(視窗控制代碼, 用戶端區域x座標, 用戶端區域y座標)
螢幕地區座標轉換為用戶端區域座標:x,y = screentoclient(視窗控制代碼, 螢幕x座標, 螢幕y座標)
當涉及滑鼠定位有關操作時往往使用螢幕地區座標,而程式(非指令碼鍵鼠類比操作的程式)相對自身位置定位操作則為用戶端區域座標,因此兩者互動座標參數時將需要這2個函數進行轉換。
鍵盤滑鼠操作與控制:
我們做遊戲的基本鍵鼠類比操作將大量使用該功能支援。
進行鍵鼠類比操作與控制首先就需要設定鍵鼠監視程式對鍵鼠操作進行攔截或過濾類比操作,而助手直接為我們提供了函數支援即可實現監視及其控制。
1) 設定監視鍵盤按鍵函數setkeywatch('函數名'):鍵盤操作
參考樣本格式為:
- setkeywatch('keyhookfunc')
- function keyhookfunc(keycode, controlkey, downorup)
- keycode : 按鍵鍵碼
- controlkeycode : Alt Shift Ctrl 的狀態
- 1:左Alt按下 2:右Alt按下
- 4:左Shift按下 8:右Shift按下
- 16:左Ctrl按下 32:右Ctrl按下
多個修飾鍵可以位元運算檢測
- downorup:0 按下 1 放開
傳回值:1-助手和Windows不再繼續處理該鍵 0-助手和Windows繼續處理該鍵
- return 1
- end
在函數keyhookfunc函數內我們就可以對所有按鍵資訊進行按鍵攔截與過濾、加入類比操作等程式處理。從而實現我們想要實現的類比鍵盤操作。
2)設定監視滑鼠訊息函數setmousewatch('函數名'):滑鼠操作
參考樣本格式為:
- setmousewatch('mousehookfunc')
- function mousehookfunc(msg)
- msg : 滑鼠訊息
- 1-左鍵按下 2-右鍵按下 3-中鍵按下
- 4-擴充鍵1按下 5-擴充鍵2按下
- 11-左鍵鬆開 12-右鍵鬆開 13-中鍵鬆開
- 14-擴充鍵1鬆開 15-擴充鍵2鬆開
- 21-滾輪上滾 22-滾輪下滾
傳回值:1-助手和Windows不再繼續處理該訊息 0-助手和Windows繼續處理該訊息
- return 1
- end
在mousehookfunc函數內我們就可以對所有滑鼠訊息進行按鍵攔截與過濾、加入類比操作等程式處理。從而實現我們想要實現的類比滑鼠操作。
3)設定監視滑鼠訊息擴充函數setmousewatchex('函數名'):滑鼠定位操作
參考樣本格式為:
- setmousewatchex('mousehookfuncex')
- function mousehookfuncex(msg, x座標, y座標)
- msg : 滑鼠訊息
- 0-滑鼠移動 1-左鍵按下 2-右鍵按下 3-中鍵按下
- 4-擴充鍵1按下 5-擴充鍵2按下
- 11-左鍵鬆開 12-右鍵鬆開 13-中鍵鬆開
- 14-擴充鍵1鬆開 15-擴充鍵2鬆開
- 21-滾輪上滾 22-滾輪下滾
傳回值:1-助手和Windows不再繼續處理該訊息 0-助手和Windows繼續處理該訊息
注意:請不要在滑鼠移動訊息中做耗時的操作,否則將會引起滑鼠移動遲鈍
如果不需要監視滑鼠移動,那麼請直接
- if msg==0 then return 0 end
- return 1
- end
setmousewatchex與setmousewatch功能基本一致,所不同的是setmousewatch函數允許長時間的延時操作類比,而setmousewatchex是絕對不建議進行有長時間的延時操作類比,否則在該延時時間內,你的滑鼠將會獃滯不受操作控制。正常指令碼操作時有延時的與滑鼠定位無關的操作在setmousewatch內進行,有關滑鼠定位的類比操作在setmousewatchex內進行處理,2者協同處理將不會有問題發生。
當某些類比操作需要進行鍵盤、滑鼠、以及滑鼠定位同時操作時指令碼就需要設定以上3個監視函數然後分解進行各司其職的類比操作與控制,而類比同步問題可以採用一種最簡單的變數狀態變化模式進行協同。這一模式廣泛應用於現有助手內建指令碼,有興趣的自行閱讀查看。
4)鍵鼠類比操作函數:
鍵盤按鍵:keypress(鍵碼)
鍵盤按鍵按下:keydown(鍵碼)
鍵盤按鍵鬆開:keyup(鍵碼)
滑鼠點擊:mouseclick(滑鼠鍵)
滑鼠鍵: 0-左鍵 1-右鍵 2-中鍵
滑鼠按鍵按下:mousedown(滑鼠鍵)
滑鼠按鍵鬆開:mouseup(滑鼠鍵)
剪輯滑鼠:lockmouse(x座標, y座標)
座標為用戶端區域座標 x座標或y座標為-1時,解除鎖定
註:客戶與地區座標為相對於程式介面的座標位置,客戶與地區座標需要與螢幕座標進行轉換。轉換函式在視窗操作內。
鎖定滑鼠:disablemouse()
解鎖滑鼠:enablemouse()
以上函數中鍵盤按鍵 與鍵盤按鍵按下和鍵盤按鍵鬆開,以及滑鼠點擊 與滑鼠按鍵按下和滑鼠按鍵鬆開的區別在於,當普通單獨鍵鼠按鍵類比時只需要鍵盤按鍵或滑鼠點擊即可,當執行按鍵組合操作時則需要鍵盤按鍵按下和鍵盤按鍵松 開、滑鼠按鍵按下和滑鼠按鍵鬆開配合完成,先執行按鍵組合的全部按下類比操作,再執行全部鬆開操作,即達到按鍵組合類比操作。當然單鍵類比操作時也可先按下再 鬆開的類比操作。其中類比操作特別是按鍵組合類比操作每一個類比之後都需要一定的sleep延時,以免某些時候類比操作失敗
5)滑鼠游標操作:
查詢滑鼠指標座標:x,y = getcursorpos()
設定滑鼠指標座標:setcursorpos(x, y)
即定位滑鼠座標
5、魔獸世界資訊擷取與支援:
助手作為魔獸世界的協助工具輔助,對指令碼的魔獸世界資訊擷取與支援將是最值得我們詳細去瞭解的。
1)魔獸世界資訊和狀態:
查詢魔獸世界版本:版本 = getwar3version()
傳回值為無符號整型數字
擷取魔獸世界路徑:魔獸世界路徑 = getwar3path()
傳回值為路徑字串
判斷魔獸世界是否在最前端:是否在前端 = iswar3front()
傳回值為0或1
判斷魔獸世界是否一運行:是否已運行 = iswar3running()
傳回值為0或1
判斷魔獸世界是否已開始:是否已開始 = isplaying()
傳回值為0或1
判斷是否處於聊天狀態:是否聊天狀態 = ischat()
傳回值為0或1
查詢當前地圖名(包含路徑):地圖名 = getmapname()
傳回值為地圖名稱字串
查詢當前選中單位ID:選中單位 = getselunit()
返回選中單位的ID列表(多個)
查詢當前選中單位ID和控制代碼:選中單位ID,選中單位控制代碼 = getselunitex()
返回選中單位的ID和控制代碼列表(多個)
查詢當前可操作單位ID和控制代碼:單位ID, 單位控制代碼 = getcurrentunit()
與“擷取當前選中單位”不同的是,此函數取得選中的一組單位中可操作的那個(魔獸世界中Tab鍵可切換)
返回領隊單位ID和控制代碼(單個)
查詢單位屬性:屬性值1,屬性值2,屬性值3,... = getunitattribute(單位控制代碼, 屬性代號1, 屬性代號2, 屬性代號3,...)
可一次查詢多個屬性值。屬性代號:
1:HP上限 2:HP 3:MP上限 4:MP
5:經驗 6:力量 7:敏捷 8:智力
9:攻擊頻率 10:基礎攻擊力 11:攻擊倍乘 12:骰子
13:攻擊類型 15:護甲 16:護甲類型
19:技能1ID 20:技能2ID 21:技能3ID 22:技能4ID 23:技能5ID
24~28:技能1~5最高等級 29:可用技能點
此函數是一個多參多傳回值函數,有多少個屬性代號參數就有多少個對應的傳回值
查詢單位物品欄資訊:物品控制代碼, 物品ID, 物品剩餘使用次數 = getunititem(單位控制代碼, 物品序號[0-5])
返回整型,字串,整型。擷取指定位置物品失敗時返回0,’’,0
喊話:talk('內容', 喊話對象)
內容:多行內容用\r\n分隔
喊話對象:0-盟友 1-所有人
設定魔獸世界視野:setcamera(視野[500~5000之間])
顯示FPS:enablefps(是否開啟[0-否 1-是])
查詢本地玩家和隊伍:SlotID, 隊伍 = getmyslotidteam()
SlotID即遊戲位置ID,該ID在主機開始遊戲前玩家的遊戲位置決定
隊伍即遊戲陣營
查詢指定SlotID的玩家資訊:隊伍, 人或電腦, 種族 = getplayerinfoex(SlotID)
人或電腦:0-人 1-電腦
種族:1-HUM 2-ORC 3-UD 4-NE
隊伍: -1:擷取失敗(可能是還沒進入遊戲,或SlotID超界) 0:無此玩家 >=1:隊伍
查詢指定SlotID的英雄列表: 英雄個數, 英雄控制代碼列表, 英雄ID列表, 英雄所屬SlotID列表 = getherolist(SlotID)
英雄控制代碼列表, 英雄ID列表, 英雄所屬SlotID列表 皆為逗號“,”分隔的字串
SlotID:-1:取所有玩家的英雄列表 -2:取自己的英雄列表 0-15:取對應SlotID的英雄列表
取出的順序符合F1~F5順序
查詢玩家索引:玩家索引 = getplayerindex(SlotID)
此函數取得玩家進入遊戲後(可能會交換陣營),實際的位置索引。
澄海交換陣營後可由此判斷玩家陣營。
2)區域網路資訊和狀態:區域網路資訊和狀態的函數依賴“主機”頁功能是否開啟
擷取主機資訊:遊戲ID, 主機IP, 主機名稱, 主機建立者名 = gethostinfo(序號[0-255])
返回ID整型值,IP字串,主機名稱字串,建立者字串
擷取玩家資訊:玩家ID, 玩家IP, 玩家連接埠, 玩家名, 玩家狀態 = getplayerinfo(序號[0-15])
玩家狀態:0-100: 地圖下載進度 256: 地圖載入完畢
返回ID整型值,IP字串,連接埠整型值,玩家名字串,狀態整型值
當自己建立主機時,自己的玩家名為實際遊戲名,當自己進入別人主機時,自己的玩家名為”<自己>”字串
擷取自己的遊戲次數:遊戲次數 = getgametimes()
擷取自己的遊戲載入狀態:遊戲載入狀態 = getgamestatus()
0:未開始 1:開始5秒倒計時 2:5秒倒計時完畢 3:遊戲開始
狀態3相當於isplaying()==1狀態
擷取剩餘位置(Slot)數:剩餘Slot數 = gethostfreeslot()
返回無符號整型數
3)助手資訊和功能:
查詢助手版本:版本號碼 = getwshscriptversion()
傳回值為無符號整型數字
查詢助手路徑:助手路徑 = getwshpath()
傳回值為路徑字串
開關助手功能:enablewshfunction(功能編號, 是否開啟)
功能編號:0-小地圖區右擊無效 1-鍵盤改鍵 2-滑鼠映射
3-允許在按鍵組合中改鍵 4-滾輪每滾一次按任意鍵複位
5-自動切換改鍵方案 6-喊話
7-Ctrl+右擊=右擊+Shift+H 8-Ctrl+左擊=A+左擊
9-Alt+[Q/W/A/S/Z/X]控制包裹欄 10-右擊=M+Shift+H
11-Alt+Num1~Num0代替Alt+1~0
12-顯示我方血條 13-顯示敵軍血條 14-屏蔽Win鍵 15-屏蔽Alt+Tab鍵
16-調整視野[0:恢複 1:近 -1:遠] 17-調整亮度[0:恢複 1:暗 -1:亮] 18-複選改鍵方案 19-單選改鍵方案
是否開啟:0-關閉 1-開啟
查詢助手功能是否開啟:是否開啟 = iswshfunctionenable(功能編號)
功能編號:0-小地圖區右擊無效 1-鍵盤改鍵 2-滑鼠映射
3-允許在按鍵組合中改鍵 4-滾輪每滾一次按任意鍵複位
5-自動切換改鍵方案 6-喊話
7-Ctrl+右擊=右擊+Shift+H 8-Ctrl+左擊=A+左擊
9-Alt+[Q/W/A/S/Z/X]控制包裹欄 10-右擊=M+Shift+H
11-Alt+Num1~Num0代替Alt+1~0
12-顯示我方血條 13-顯示敵軍血條 14-屏蔽Win鍵 15-屏蔽Alt+Tab鍵
16-主機功能
是否開啟:0-關閉 1-開啟
擷取當前喊話方案名:名稱 = getseltalkscheme()
返回字串
擷取所選改鍵方案名:名稱 = getselkeyscheme()
返回字串
擷取喊話方案列表:名稱 = gettalkschemelist()
各個方案名稱之間用分行符號'\n'隔開
擷取改鍵方案列表:名稱 = getkeyschemelist()
各個方案名稱之間用分行符號'\n'隔開
擷取當前喊話方案內容:內容 = getseltalkwords()
返回喊話內容字串
擷取所選改鍵方案內容:內容 = getselkeymaps()
返回改鍵方案內容
選擇指定喊話方案:是否成功 = seltalkscheme('方案名')
返回0或1
選擇指定改建方案:是否成功 = selkeyscheme('方案名', 是否選擇[1-選擇 0-不選])
返回0或1
判斷改鍵方案是否被選中:是否選擇 = iskeyschemesel('方案名')
返回0或1
執行改建序列:是否成功 = runkeys('改鍵序列')
如:runkeys('使用物品I50I 使用物品B60I DOTA近衛基地')
返回0或1,是否成功僅代表改鍵序列是否可成功執行,不代表實際類比操作成功與否
等待改鍵序列執行完成:waitrunkeysdone()
與runkeys配套使用
助手中的Lua使用注意事項:
助手中的Lua因為提供的一些支援和機制,有些會跟原版Lua會有所不同,因此實際指令碼製作或修改時要特別注意一些問題:
1)類比操作盡量不要執行長時間延時的類比操作,否則個人的遊戲操作能力將直線下降,還可能因此而導致因實際遊戲情況而造成極大的失誤。比如諸葛風E司馬風N指令碼,只能拿來玩玩學習,切不可用於實戰,因為這種長時間延時的類比操作因實戰具體情況影響因素太大。
2)定時器或函數指令碼常駐延時程式(無限迴圈wile、repeat等)與鍵鼠監視訊息監視函數切不可同處於一個指令碼內。定時器函數或指令碼常駐程 序和鍵鼠訊息監視函數都會新起一個單獨的線程,而Lua指令碼是不支援多線程的,因此會導致這2類函數同竟資源問題,極可能導致指令碼崩潰。而定時器函數和腳 本常駐延時程式(無限迴圈wile、repeat等)不建議處於一個指令碼,因為如果先執行的是指令碼常駐延時程式時,程式之外的定時器將永遠不會執行;一個 指令碼可以有多個定時器。
3)指令碼常駐延時程式即迴圈內含延時操作,與定時器一樣都能定時執行程式,而它與定時器卻有很大不同:首先指令碼常駐延時程式可以自訂先延時還是 先程式的問題,而定時器本身則是固定的先延時後程式;其次指令碼常駐延時程式實際延時時間除了明確的延時時間外還包含程式執行的實際時間,而定時器則會固定 的根據設定時間執行程式,程式段執行頻率是固定的。二者因為這些異同將有不同的用處,具體使用哪種根據程式實際情況需要而取捨。
小結:魔獸世界超級助手Lua指令碼語言的內容介紹完了,希望通過本文的學習能對你有所協助!