写在前面:AutoHotKey,即AHK,类似于宏,属于硬件脚本,有些人也会称这类东西叫硬件作弊,但是它不会被VAC(当然,有可能被OW)。
这实际上是我的第四篇专栏,在第三篇的脚本基础上进行了大量的修改。第三篇专栏发布后被锁定了,所以且行且珍惜。被锁定或者删除的专栏不会再以其他形式发布,除非我又对脚本进行了改进。
这次的话不仅会说明脚本本身的功能,也会说一下这个接近12000行的代码是如何一步步写出来的。
本次的脚本总共有以下功能:
1、支持7把步枪:AK47、M4A4、M4A1、Galil、Famas、Aug、Sg553,7把冲锋枪:MP9、Mac10、Ump45、MP7、MP5SD、P90、Bizon,1把手枪:cz75,1把机枪:M249。上述枪械压枪均支持整个弹夹,并且支持最新版本(说的就是你,削成弟弟的553);
2、在压枪的同时实现子弹落点的标注,使得扫射转移变得非常容易;
3、所有操作均有语音提示与右上角文字提示;
4、能够选择开启自动检测是否选用主武器的功能,在选用主武器时开启压枪,选用其他武器或道具时关闭压枪(仅支持1920*1080分辨率)。
下面就这几个功能如何实现进行说明。
首先是压枪数据的获得以及压枪的实现。
压枪数据是一个很大的难题,因为网上基本没有直接可用的数据,即使是外网,除了已经被写在脚本里的、几把烂大街枪的数据,也只有扫射落点的动图。
等等,你是不是说有动图?
很明显,这种动图是通过压枪数据制作的,而我们所需要做的就是利用图像处理将压枪数据反推出来。注意到那个中心就是子弹落点的浅灰色十字了吗?只需要在图片第一列与第一行读出浅灰色的坐标,就可以确定出子弹的落点。我的话是利用matlab进行实现的,将gif逐帧读进去后,对每帧所对应数组的第一列与第一行进行扫描,即可获得基于图片尺度的弹道相对坐标。
压枪时鼠标移动的轨迹就是弹道的180度旋转,所以有了相对坐标后,只需要研究出实际尺度与所得数据尺度的比例关系,即可实现压枪。对于鼠标移动的实现方法,我采用的是国外visloom28vi的方法:
这个代码是利用“mouse_event”这个dll实现的,总共需要填入3个参数,每个参数前需要说明参数的类型“UInt”,“UInt”其实就是Unsigned Int 的缩写。第一个参数说明的是实现的功能,比如这里的1(0x01是十六进制的1,没啥区别)代表鼠标仅移动,2代表鼠标移动并点击。后面两个参数很简单,一个是横坐标的偏移量,一个是纵坐标的偏移量。
之所以在偏移量后面成一个modifier,实际上作者原本是用来适配不同游戏内鼠标灵敏度的,但在此基础上自然也可以乘上系数来适配压枪数据与屏幕的分辨率:
至于比例系数如何确定,则需要实际进游戏中进行观察,如果偏上就调大,偏下就调小。
这个等待时间的话基本上是在武器射速反推的基础上,根据游戏内表现进行一定的调整,因为代码的运行也需要时间。这里分享一个可以看武器伤害、射速、射击不确定度等数据的网址(需要翻墙):https://docs.google.com/spreadsheets/u/0/d/11tDzUNBq9zIX6_9Rel__fdAUezAQzSnh5AVYzCP060c/htmlview#
值得一提的是,部分枪械的射速并不恒定,有的部分会突然变慢或变快,需要精调。
接下来说明一下子弹标注的实现。其实原理上很简单,就是利用AHK的Gui功能,根据弹道数据在对应点处显示一个色块即可,如果已经有压枪数据的话,可以很简单的实现:
其中,x、y用于记录累计的弹道偏移,而x1、y1则为标注点的横纵坐标。因为无论什么时候准信总是在屏幕的正中央,所以屏幕正中的坐标加上弹道的偏移便是理论子弹落点的位置。
语音提示和文字右上角显示也很简单,AHK播放语音就一行代码的事:
文字提示也是利用Gui功能:
第一行是销毁之前的文字,第二行是创建一个没有按钮、没有标题、永远在顶层显示的Gui,第三行到第五行是将该Gui的背景置为透明,第六行为设置文本字体(s是大小,c是RGB颜色,w是粗细),第七行是加入文字“off”,第八行是在对应位置显示一个不可交互的Gui。
最后,是自动检测功能。自动检测功能说简单很简单,但是实际写的时候才发现着实有点坑。
自动检测的原理是:检测右下角主武器图标处是否呈选中状态(图标变成白色,即0xffffff),如果是则开启压枪,否则关闭压枪。
是不是很简单?但是,游戏中各个武器的图标长得并不相同,如何选取检测点是第一个问题;其次,在拿道具、钳子和C4的时候主武器的位置会发生改变,并且改变量并不相同,这就需要对多个点进行检测。于是,实际代码变成了这个样子:
这里检测的点是主武器图标右侧“1”的最上端,以此来判断主武器图标的位置。5个点是因为5种情况,分别是有道具、有C4、有钳子、有C4和道具、有钳子和道具,最后剩下的就是没有道具、钳子与C4。
确定完主武器图标位置后,判断是否为纯白色即可:
至于PixelGetColor的位置,我选取的是每个武器图标的中心,这个取点比较随意,只要在图标范围内皆可。
至此,脚本的功能实现就基本讲完了。其实你会发现,虽然脚本这么长,但是其中有很多部分都是一样的,只需要修改部分数据。实际上,我在写这个脚本的时候很多代码都是利用Excel表里的数据和Matlab生成的,这比手动复制粘贴再修改快了不少。
介绍完了功能的实现,接下来说一下脚本的使用。
首先,不了解AHK使用的请阅读第一篇专栏。强烈建议AHK安装在C盘。
键位绑定脚本内有说明,在此不再赘述:
因为枪械数量实在太多,所以分成了三类,一类是步枪,一类是冲锋枪,剩余的为一类。选择枪械时,需要先切换到对应的列表(步枪/冲锋枪),然后再按下单独枪械对应的按键。cz75与m249不在两个列表内,可以直接选择。
选择完枪械后,按下压枪功能开关键手动开启或者关闭压枪功能。
如果打开了自动检测模式,仍然需要手动选择对应的枪械,但是不需要手动按下压枪功能键进行压枪的开关。此时如果按下压枪功能开关键,会自动回到手动模式。
弹道标注功能与压枪功能同时开启与关闭。
最后的最后,便是白嫖党最喜欢的源码分享链接。
学校网盘(可以直链下载,但是不定时抽风):
https://pan.seu.edu.cn:443/#/link/4804921DF8D922D0DE23E329082CEA50
百度网盘:
链接:https://pan.baidu.com/s/1beVSarI68Qbxmb3Fp2Q0_A
提取码:y592
未来的话估计一段时间内不会再发新专栏,因为保研的相关事宜有些烦人,而且目前没有什么想实现的功能。如果有问题欢迎私信,一般一天会看一次。
祝各位游戏愉快。