魔兽世界超级助手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等)不建议处于一个脚本,因为如果先执行的是脚本常驻延时程序时,程序之外的定时器将永远不会执行;一个 脚本可以有多个定时器。