Lua 语言 详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
脚本制作实例讲解: 脚本制作实例讲解:
助手的Lua脚本制作需要你对编程有一定基础,特别是脚本编程;需要你熟悉Lua 基本的语法结构、程序结构、使用习惯及约定、注意事项等。
只要你有一定的编程基础, 并基于以上知识的了解和学习,脚本制作将不难进行。
助手的Lua脚本制作中关于模拟操 作的脚本你还需要清楚你实现模拟操作的每一个细节,要能分解每一个细节到程序实现 上,这样你才能更好的完成脚本。
下面我们举出一个具体的魔兽操作实例脚本给大家一个 脚本制作实现思路和方式。
我们来看一个魔兽内吃药脚本的实现。
脚本实例: 脚本实例:魔兽吃药脚本 思路准备: 1. 思路准备:
魔兽吃药是玩魔兽的一个关键项,然而有些地图药品繁多更显吃药之特点。
吃药虽然是一个简单的事情,但是当我们玩一个单机或挂机升级的图时,能自动 吃药挂机那将是有用的了,我们就此来进行实现魔兽自动吃药挂机的脚本,其中 吃药最常见的就是一点即用型药品了,还有一种使用后需要指定目标的麻烦点, 但是新版本的智能改键指令加上执行改键序列函数实现起来也是很简单的事。
而 且最好能挂机吃药魔兽可以不再前端,那我们就可以挂机干其他事了^_^。
实现思想: 2. 实现思想:
要进行自动吃药监视我们要先想如何自动法?自动的前提当然是要定时检测 当前英雄血蓝量,这就需要用到定时器和延时;检查血量又需要用到查询单位属 性getunitattribute函数,此外还需要用到键鼠模拟操作函数等。
下面我们以一 个具体地图实例来讲解脚本制作。
地图就选择风霜的《遗失的记忆》吧
开始编写测试修改代码: 3. 开始编写测试修改代码:
基于以上的准备那我们先新建一个脚本,暂时命名为“runAutoPress.txt”吧, 下面就逐步开始代码吧: 1) 先定义几个可能用到的变量和初始值,并将血瓶放到包裹7位置,魔瓶放到 包裹8位置。
hppt=0.75 --血量值监视限度保户值,即血量值的 75% mppt=0.15 --魔法值监视限度保户值,即魔法值的 15% msPress=200 --监视间隔时间,暂停200ms 2) 设置对应血魔监视的定时器函数,并加入基本代码: function runAutoPressFunc() if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if hp/hpmax<hppt then --判断当前的血量值比率是否小于设定 值 keypress(103) --小于则执行小键盘7按键加血 end if mp/mpmax<mppt then --判断当前魔法值是比率否小于设定值 keypress(104) --小于则执行小键盘8按键加魔
end end end tmAutoPress=settimer(msPress, 'runAutoPressFunc') keypress(103)可用runkeys(“使用物品dpsp”)代替,keypress(104)可用 runkeys(“使用物品lclp”),其中dpsp为中型生命药水ID,lclp为中型魔法药水 ID,2者效果相同,只是参数及使用不同,keypress需要指定物品位置,而 runkeys需要指定使用物品ID。
这样基本就可以实现了自动吃药。
但实际中我们 会发现血量达到保户值时,使用药品没能立即补上时,药水将在监视时间间隔内 达到程序条件时一直使用!这就无异于浪费药水。
这当然不是我们想要的!那如 何解决呢?有的人会说那把监视时间调大吧!调大是可以降低浪费吃药的程度! 但是随之会产生不能及时吃药的问题!因为监视时间间隔过大,在这监视时间间 隔里英雄很有可能会死掉,也显然不好。
不能增加监视时间那这个定时器工作模 式如何改进呢?我们可以利用关闭定时器的方法,关闭掉定时器加入延时,延时 过后然后我们再打开它就OK,既然想明白了那我们改程序: hppt=0.75 --血量值监视限度保户值,即血量值的 75% mppt=0.15 --魔法值监视限度保户值,即魔法值的 15% msPress=200 --监视间隔时间,暂停200ms msHPPressWait=7000 --吃红间隔时间,7秒 msMPPressWait=9000 --吃蓝间隔时间,9秒 function runAutoPressFunc() if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if hp/hpmax<hppt then --判断当前的血量值比率是否小于设定 值 keypress(103) --小于则执行小键盘7按键加血 killtimer(tmAutoHPPress) --关闭定时器 sleep(msHPPressWait) --延时加血操作 tmAutoHPPress=settimer(msPress, 'runAutoHPPressFunc') --打开定时器 end if mp/mpmax<mppt then --判断当前魔法值是比率否小于设定值 keypress(104) --小于则执行小键盘8按键加魔 killtimer(tmAutoHPPress) --关闭定时器 sleep(msMPPressWait) --延时加血操作 tmAutoHPPress=settimer(msPress, 'runAutoHPPressFunc') --打开定时器 end
end end tmAutoPress=settimer(msPress, 'runAutoPressFunc') 这样能自动吃药且不浪费药了,是不是好了呢?在实际中你还会发现 有时候血补上,而蓝没补上,有时候蓝补上而血没补上,是什么原因呢?因为我 们把血魔监视放在离一个定时器函数,理论上看似这并没有问题,达到判断条件 就应该加血加蓝的,但因为我们设置了吃药间隔时间,因而吃红后必然影响吃蓝 的监视,吃蓝时必然会影响吃红的监视!那怎么办呢? 有想法的人会说分开2个定时器监视不就好了?说的好,是这样的, 下面我们就把它改成2个定时器的模式来看看,便于名称命名的区别,我们将部 分名称改变一下如下: hppt=0.75 --血量值监视限度保户值,即血量值的 75% mppt=0.15 --魔法值监视限度保户值,即魔法值的 15% msPress=200 --监视间隔时间,暂停200ms msHPPressWait=7000 --吃红间隔时间,7秒 msMPPressWait=9000 --吃蓝间隔时间,9秒 function runAutoHPPressFunc () if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if hp/hpmax<hppt then --判断当前的血量值比率是否小于设定 值 keypress(103) --小于则执行小键盘7按键加血 killtimer(tmAutoHPPress) --关闭定时器 sleep(msHPPressWait) --延时加血操作 tmAutoHPPress=settimer(msPress, 'runAutoHPPressFunc') --打开定时器 end end end function runAutoMPPressFunc () if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if mp/mpmax<mppt then --判断当前魔法值是比率否小于设定值 keypress(104) --小于则执行小键盘8按键加魔 killtimer(tmAutoHPPress) --关闭定时器 sleep(msMPPressWait) --延时加血操作
tmAutoHPPress=settimer(msPress, 'runAutoHPPressFunc') --打开定时器 end end end tmAutoHPPress=settimer(msPress, 'runAutoHPPressFunc') tmAutoMPPress=settimer(msPress, 'runAutoMPPressFunc') 到此功能和使用已完全实现,但我们会发现这样的方式必须要魔兽处 于前端才能自动吃药!而我们想要把魔兽最小化后还能自动吃药就不行了!那我 们要实现魔兽不在前端或最小化时如何自吃药呢?熟悉windows程序设计或原理 的朋友就会想到用消息机制吧?是的,就要用到消息机制,来实现吃药吧!我们 为程序增加一个keypressEx函数来实现消息机制按键,更改脚本为如下代码: hppt=0.75 --血量值监视限度保户值,即血量值的 75% mppt=0.15 --魔法值监视限度保户值,即魔法值的 15% msPress=200 --监视间隔时间,暂停200ms msHPPressWait=7000 --吃红间隔时间,7秒 msMPPressWait=9000 --吃蓝间隔时间,9秒 function keypressEx(keycode) hWar3 = getwar3window() sendmessage(hWar3, 256, keycode, 0) sleep(1) sendmessage(hWar3, 257, keycode, 0) end function runAutoHPPressFunc () if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if hp/hpmax<hppt then --判断当前的血量值比率是否小于设定 值 keypressEx (103) --小于则执行小键盘7按键加血 killtimer(tmAutoHPPress) --关闭定时器 sleep(msHPPressWait) --延时加血操作 tmAutoHPPress=settimer(msPress, 'runAutoHPPressFunc') --打开定时器 end end end function runAutoMPPressFunc () if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息
hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if mp/mpmax<mppt then --判断当前魔法值是比率否小于设定值 keypressEx (104) --小于则执行小键盘8按键加魔 killtimer(tmAutoHPPress) --关闭定时器 sleep(msMPPressWait) --延时加血操作 tmAutoHPPress=settimer(msPress, 'runAutoHPPressFunc') --打开定时器 end end end tmAutoHPPress=settimer(msPress, 'runAutoHPPressFunc') tmAutoMPPress=settimer(msPress, 'runAutoMPPressFunc') 这样更改后,就可以实现无限制的自动吃药了,是不是很爽?爽的话 就嚎叫吧,O(∩_∩)O~! 然而有的朋友玩的时候还会发现一个问题,虽然以上程序能自动吃药 且不浪费还能挂机,但是有的图红蓝有多种,我们包裹里可能放了多种药,而每 种药冷却时间较长,一种药补血可能补不过来会导致英雄挂掉!为了解决这个问 题我们可以再增加几个血量限度保护值和对应的补血定时器程序,前面我们也提 到了防止多个判断写在一起导致延时时其后的程序有可能不被实际需要时而未执 行的问题。
我们再增加多个血量监视吃药定时器及函数,同时为了变量和程序名 的规整,我们将部分名称稍作改变如下程序: hppt0=0.75 --第一重血量值监视限度保户值,即血量值的 75% hppt1=0.55 --第二重血量值监视限度保户值,即血量值的 55% hppt2=0.35 --第三重血量值监视限度保户值,即血量值的 35% mppt=0.15 --魔法值监视限度保户值,即魔法值的15% msPress=200 --监视间隔时间,暂停200ms msHPPressWait0=7000 --第一重吃红间隔时间,7秒 msHPPressWait1=8000 --第二重吃红间隔时间,8秒 msHPPressWait2=5000 --第三重吃红间隔时间,5秒 msMPPressWait=9000 --吃蓝间隔时间,9秒 function keypressEx(keycode) hWar3 = getwar3window() sendmessage(hWar3, 256, keycode, 0) sleep(1) sendmessage(hWar3, 257, keycode, 0) end function runAutoHPPress0Func () if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4)
--获取该单位的血魔的最大值和实际值 if hp/hpmax<hppt0 then --判断当前的血量值比率是否小于设定 值 keypressEx (103) --小于则执行小键盘7按键第一重加血 killtimer(tmAutoHPPress0) --关闭定时器 sleep(msHPPressWait0) --延时加血操作 tmAutoHPPress0=settimer(msPress, 'runAutoHPPress0Func') --打开定时器 end end end function runAutoHPPress1Func () if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if hp/hpmax<hppt1 then --判断当前的血量值比率是否小于设定 值 keypressEx (100) --小于则执行小键盘4按键第二重加血 killtimer(tmAutoHPPress1) --关闭定时器 sleep(msHPPressWait1) --延时加血操作 tmAutoHPPress1=settimer(msPress, 'runAutoHPPress1Func') --打开定时器 end end end function runAutoHPPress2Func () if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if hp/hpmax<hppt2 then --判断当前的血量值比率是否小于设定 值 keypressEx (101) --小于则执行小键盘5按键第三重加血 killtimer(tmAutoHPPress2) --关闭定时器
sleep(msHPPressWait2) --延时加血操作 tmAutoHPPress2=settimer(msPress, 'runAutoHPPress2Func') --打开定时器 end end end function runAutoMPPressFunc () if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if mp/mpmax<mppt then --判断当前魔法值是比率否小于设定值 keypressEx (104) --小于则执行小键盘8按键加魔 killtimer(tmAutoHPPress) --关闭定时器 sleep(msMPPressWait) --延时加血操作 tmAutoHPPress=settimer(msPress, 'runAutoHPPressFunc') --打开定时器 end end end tmAutoHPPress0=settimer(msPress, 'runAutoHPPress0Func') tmAutoHPPress1=settimer(msPress, 'runAutoHPPress1Func') tmAutoHPPress2=settimer(msPress, 'runAutoHPPress2Func') tmAutoMPPress=settimer(msPress, 'runAutoMPPressFunc') 经过以上修改我们就实现了三重血量保护(小三:哇!这下挂机不会 死了^_^),这样就更有效的保证了我们的英雄不会挂死!有些细心的用户或对 程序熟悉的朋友就会发现还有一个问题。
那就是这三重血量保护中当第二重保护 在吃红时第一重保护也在也在吃红,当但三重保护在吃红是第一重第二重也在吃 红,而我们经常习惯的是血量减少的不多时吃小红(第一重),血量减少的较多时 吃中红(第二重),血量频危时吃大红(第三重),这明显就会造成浪费吃红,甚至于 有的图先吃了大红后吃了小红就只有小红的效果了,那我们的英雄岂不会命丧黄 泉?为了解决这个问题我们还需要修改一次如下: hppt0=0.75 --第一重血量值监视限度保户值,即血量值的 75% hppt1=0.55 --第二重血量值监视限度保户值,即血量值的 55% hppt2=0.35 --第三重血量值监视限度保户值,即血量值的 35% mppt=0.15 --魔法值监视限度保户值,即魔法值的15% msPress=200 --监视间隔时间,暂停200ms msHPPressWait0=7000 --第一重吃红间隔时间,7秒 msHPPressWait1=8000 --第二重吃红间隔时间,8秒 msHPPressWait2=5000 --第三重吃红间隔时间,5秒
msMPPressWait=9000
--吃蓝间隔时间,9秒
function keypressEx(keycode) hWar3 = getwar3window() sendmessage(hWar3, 256, keycode, 0) sleep(1) sendmessage(hWar3, 257, keycode, 0) end function runAutoHPPress0Func () if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if hp/hpmax<hppt0 then --判断当前的血量值比率是否小于设定 值 keypressEx (103) --小于则执行小键盘7按键第一重加血 killtimer(tmAutoHPPress0) --关闭第一重血量监视定时器 sleep(msHPPressWait0) --延时加血操作 tmAutoHPPress0=settimer(msPress, 'runAutoHPPress0Func') --打开定时器 end end end function runAutoHPPress1Func () if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if hp/hpmax<hppt1 then --判断当前的血量值比率是否小于设定 值 keypressEx (100) --小于则执行小键盘4按键第二重加血 killtimer(tmAutoHPPress0) --关闭第一重血量监视定时器 killtimer(tmAutoHPPress1) --关闭第二重血量监视定时器 sleep(msHPPressWait1) --延时加血操作 tmAutoHPPress0=settimer(msPress, 'runAutoHPPress0Func') tmAutoHPPress1=settimer(msPress, 'runAutoHPPress1Func')
--打开定时器 end end end function runAutoHPPress2Func () if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if hp/hpmax<hppt2 then --判断当前的血量值比率是否小于设定 值 keypressEx (101) --小于则执行小键盘5按键第三重加血 killtimer(tmAutoHPPress0) --关闭第一重血量监视定时器 killtimer(tmAutoHPPress1) --关闭第二重血量监视定时器 killtimer(tmAutoHPPress2) --关闭第三重血量监视定时器 sleep(msHPPressWait2) --延时加血操作 tmAutoHPPress0=settimer(msPress, 'runAutoHPPress0Func') tmAutoHPPress1=settimer(msPress, 'runAutoHPPress1Func') tmAutoHPPress2=settimer(msPress, 'runAutoHPPress2Func') --打开定时器 end end end function runAutoMPPressFunc () if 1==isplaying() then --当游戏正在进行时才执行 unitid,unithandle=getselunitex() --获取当前英雄单位ID和句柄信息 hpmax,hp,mpmax,mp= getunitattribute(unithandle, 1, 2, 3, 4) --获取该单位的血魔的最大值和实际值 if mp/mpmax<mppt then --判断当前魔法值是比率否小于设定值 keypressEx (104) --小于则执行小键盘8按键加魔 killtimer(tmAutoHPPress) --关闭定时器 sleep(msMPPressWait) --延时加血操作 tmAutoHPPress=settimer(msPress, 'runAutoHPPressFunc') --打开定时器
end end end tmAutoHPPress0=settimer(msPress, 'runAutoHPPress0Func') tmAutoHPPress1=settimer(msPress, 'runAutoHPPress1Func') tmAutoHPPress2=settimer(msPress, 'runAutoHPPress2Func') tmAutoMPPress=settimer(msPress, 'runAutoMPPressFunc') 在执行第X重加血时,我们把小于X重的定时器关掉,然后执行对应阶 段吃红间隔,之后再打开对应的定时器,这样就不会在造成浪费吃药了!O (∩_∩)O~现在用起来是不是感觉很美了? 最后我们强调一下这里面的延时时间问题,定时器的执行周期时间要 合适,不能太大也不能太小,太大会导致程序延误实际情况过大,太小会增加 CPU负担!吃红间隔时间要视游戏实际情况而定,需要自己测试!他会因红的冷 却时间、英雄挂怪的掉血速度和程序等情况决定,时间要差不多合适英雄不会死 即可,浪费一点药是必须的,但我们程序要减少浪费药的可能性。
我们这个脚本 虽然只是吃药的脚本,当然你可以自己写一个自动使用某些不要鼠标指向而只需 键盘完成操作技能的脚本,需要配合鼠标操作的技能加进去就必须游戏置于最前 端不能干其他事了!你可以另起脚本自己写,也可以在该脚本增加一个固定周期 时间执行技能操作的定时器,有兴趣可以自己练习练习。
4. 归纳总结: 归纳总结:
1) 我们编写脚本一定要对我们要实现的目的进行准确的分析,把握好每一个 模拟操作的细节,以及程序运行实际中可能遇到的问题及其解决方法。
2) 模拟操作的延时时间很关键,这个时间需要自己测试出一个合适的时间, 否则脚本的实用性将会大打折扣! 3) 有时候为了测试的方便我们肯那个加入了一些不必要的语句或变量,最终 测试完全成功后,需要对程序做最大优化,以减少CPU负担! 到此我们的自动吃药脚本圆满完成。
到此我们的自动吃药脚本圆满完成。
。