魔獸世界超級助手Lua腳本語言
魔獸世界超級助手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腳本語言的內容介紹完了,希望通過本文的學習能對你有所幫助!