正在阅读:按键精灵冷血课堂1:如何通过读取颜色来“认识”数字?按键精灵冷血课堂1:如何通过读取颜色来“认识”数字?

2009-04-28 16:58 出处:PConline原创 作者:佚名 责任编辑:zhangyifei

  记得很久以前曾经跟兄弟论坛上的一个朋友说过,猎手确实就是一个读颜色的脚本,根本没有涉及读取内存。不是按键精灵不支持读取内存地址(按键精灵从内存地址中读取一个数字,还是很简单的,一条命令就可以实现),也不是说游戏中的数值多么难以得到,以热血江湖为例,那些常用数值的地址,全是固定地址,要找到那些地址,实在是太简单了,相对于那些采取“动态地址”的网络游戏,寻找热血江湖的地址就是小儿科了。当然,这不是本文的重点,今天,我不是来教大家找地址的,而是教大家如何通过另外一种方法得到游戏中我们需要的“数值”,那就是通过读取屏幕上的颜色。

  猎手为什么要写成一个纯颜色挂,这跟热血江湖这个网络游戏有关。热血在刚推出来的时候,反外挂的措施是很严厉的,那时候别说什么真正的修改游戏客户端、拦截游戏封包的外挂,就是使用按键精灵的脚本,也存在被封号的危险。为了保证脚本的有效性--别一出来就被列为打击的对象啊--猎手采取了纯颜色的脚本思路,绝对不涉及内存数据的读取与修改。它不修改任何内存数据,仅仅靠读取屏幕上各种颜色,达到挂机、解放双手的目的。当然了,现在的热血江湖,外挂满天飞,BUG满天飞,使用热血嘉年华、热血超辅、热血智辅的比比皆是,不过我也知道,免费的猎手仍然有一定的市场,不过由于很多号级别都很高了,原版猎手不支持垃圾石头过滤,导致经常仓库满而停挂,也有一些人不用猎手改用别的去了。我也注意到,有些朋友使用插件而实现了垃圾石头过滤,不过,猎手当时已经留下了过滤垃圾石头的“种子”,所以我来说一说,不使用任何读字插件,依照猎手以前的脚本思路继续写下去,来完成垃圾石头过滤的功能。

  在正式开讲之前,冷血先作几点说明:

  1,这里讲的,是脚本写作的“技术性”问题,而不是现成的脚本,我希望你看完本帖之后,能解开你心中的疑惑:凭什么只读颜色就能识别数字呢?

  2,如果自认为是高手,就不要看此帖子了;如果不想学脚本的编程思路,只要现成的脚本,也不必看此帖子,更不必回帖了。

  3,阅读此帖子需要有猎手使用经验,此贴并非猎手使用入门教程。

  如何过滤垃圾石头,其实一点也不难,不过我想,看此帖子的朋友水平可能参差不齐,那么我就从最基础的讲起吧。先说说,如何通过读取屏幕上的颜色,达到识别数字的目的。以后的几课,再继续讲如何识别汉字、如何过滤垃圾石头。另外,如何使宠物隐身(只看见宠物的名字,看不见宠物)、如何删除竹林(只看见怪,看不见竹林)、如何双库补给(让猎手同时支持个人仓库、综合仓库补给,使原来支持最多9999个红蓝,升级到能够支持9999×2=19998个红蓝)、如何3D定位(如何得到3D游戏里面的坐标与显示器屏幕上位置的“转换公式”,确保在斜视角下,想走到哪里就能走到哪里)等等。后面的内容,有时间再写。

  好啦,现在言归正传。如果你使用过猎手,却不明白为什么开挂时,猎手能正确的报出自己的坐标,那么看完此帖子,我相信你就会明白其中的道理。先简单介绍一下,以下所称猎手的脚本,指的是两个部分:一是“_热血江湖挂机升级1.txt”,二是“FindMon.vbs”,前者是主要的脚本内容,后者是一些“函数”。采取“脚本+函数”的方式,主要的目的就是使整个脚本看起来清晰、明了。大家以后写程序,也要有一个好的习惯,不要把程序写的像一锅粥。

  要使脚本读出坐标点,首先要确认坐标位置、颜色稳定,如果某一个数字的位置忽东忽西,颜色时红时蓝,那么要识别这个数字就比较麻烦,幸好,我们现在要识别的坐标数字,位置是相对固定的,颜色也是相对固定的。看图一:






  登录游戏之后,就会在右上角的小地图上,看到红字写的一串数字,那就是人物角色在游戏里的坐标。在这个例子里,人物坐标是X=554,Y=2223。两者之间,是一个红色的小数点。我们对这里所有的点的颜色进行分析,就可以得到该点颜色的值。为方便理解,我这里取十进制来表示颜色,红色:181-189,绿色0-4,蓝色0(任何颜色的取值范围都是0-255,如果使用十六进制来表示,则为0-FF)。

  在这里,有一个非常关键的概念:基准点。你也可以称它为“核心点”、“不变点”。这是什么意思呢?就是说,不论游戏里的数值如何变换,但是总有某个“特点”是不变的!不论是坐标、位置,还是颜色。它就类似于我们人的双脚所踩的地面,你若想跳到高处,首先就必须保证自己脚踩的地方是稳定的。如果脚都踩不稳,想跳到别的地方那是不可能的了。具体到热血江湖这个游戏里,什么是“基准点”呢?中间那个小数点呢?显然不是:前一张图片中,小数点排在第4个位置,后一张图片,小数点排在第5个位置。我们看到的那个数值554,是吗?不是。因为它也不是固定不变的,在游戏里,它可以变成54,也可以变成5554。请看图二:

 




  这副图片中,X坐标变成了6740。X的数值是随时变换的,可能是1位数,也可能是4位数,可能是正整数,也可能是负整数。

  在这里,我们要经过仔细分析,如果你仔细对比一下,可以发现有一个特点却是固定的:X坐标的第一个数字出现的位置,也就是图一中的“5”,图二中的“6”,由实际的测试得知:它们出现的位置是固定不变的。

  现在,我们把上面举例的图一放大8倍来看:



 

 



  看上图,我们看到的除了“数字”,还有什么呢?还有“点阵”,这是一个非常重要的技术点!脚本不论是识别“数字”、“汉字”,归根结底,其实就是在识别一个一个的“点”。

  如果你还是不明白的话,我再举个例子:现在我们经常使用的打印机,大都是激光或者喷墨打印机。有没有那个朋友使用过“针式打印机”的?就是那种使用“针头”和“色带”,打印的时候“吱吱”响的那种打印机。打印机“认识”汉字吗?当然是不认识的。那么它为什么能打印出汉字呢?其实对于打印机来说,它并没有“认为自己打印出汉字”,实际上,它打印的是“点阵”:打印的是一个一个的“点”。

  还是以上面那个数字“5”为例,一共由40个点组成,当打印机要打印出这个“5”字的时候:

  1,

  打印机先在规定的位置连续打印5个点,也就是数字“5”上面的那一行;

  2,

  然后第二行只打印第一个点,后面4个点不打印;

  3,

  第三行也只打印第一个点,后面4个点不打印;

  4,

  第四行连续打印4个点,第五个点不打印;

  5,

  第五行前4个点不打印,只打印第五个点;

  6,

  第六行同第五行一样,前4个点不打印,只打印第五个点;

  7,

  第七行打印第一个点,第二、第三、第四点不打印,第五点打印;

  8,

  第八行第一点不打印,第二、第三、第四点打印,第五点不打印。

  我这里说的很罗嗦,当然,打印机在实际的打印过程中,打印速度还是很快的。我罗里罗嗦一大段话,打印机执行起来一瞬间而已。你们在看我上面那一段话的同时,也可以拿出一张纸和一只笔,在纸上画一个5×8的网格,要打印的地方,你就写一个阿拉伯数字“1”,不打印的地方,你就写一个阿拉伯数字“0”。全部写完之后,你看看手中的纸,上面写的是类似于“1111110000”的数字,你如果想象力够好的话,现在就可以看出纸上面写的是什么了。什么,还是看不懂?就算你现在还是看不出来,没关系,你现在把所有的写“1”的网格,都涂成黑色,所有的写“0”的网格,不要涂任何颜色。现在你再看看你手中的纸,看不清就把纸稍微放远一点看,是不是看到一个阿拉伯数字“5”呢?

  说到这里,相信朋友们应该明白了吧?如果你能看懂我上面所说的内容,那么恭喜你,可以继续往下看了。如果看不懂,那你就要反复多看几遍了。“点阵”的概念,是我们这一课以及以后几课的基础。

  现在我们反过来想一想:能不能通过读取“一个一个的点”,来“识别”数字呢?

关注我们

最新资讯离线随时看 聊天吐槽赢奖品