admin管理员组

文章数量:1533106

2023年12月17日发(作者:)

[教程] 冷血课堂1--如何通过读取颜色来“认识”数字?

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

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

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

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

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

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

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

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

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

登录游戏之后,就会在右上角的小地图上,看到红字写的一串数字,那就是人物角色在游戏里的坐标。在这个例子里,人物坐标是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”呢?

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

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

(43.72 KB)

接下来,我们继续分析:以上坐标数字,使用的是5×8点阵,每个数字之间,间隔一列。第一个数字的位置是固定的,每个点的颜色范围也是固定的(在本机上读取的颜色是:红色:181-189,绿色0-4,蓝色0)。

如何知道“5”字最左上角那一点的坐标呢?直接借助WINDOWS系统自带的“画图”软件就可以实现了。首先在游戏里按下“Print Screen”键,然后退出游戏,直接调用“画图”工具软件“粘贴”,得到的就是24位色BMP格式的位图文件。把鼠标指到数字“5”的左上角位置,如果你是使用1024×768的分辨率游戏的话,显示该点坐标是“877,24”。如果是其它的分辨率,那么你自己归纳一下,可以得到X值、Y值的规律的,在这里,我们得到的规律是:

X=屏幕宽度-147

Y=24

现在我们打开Windows系统自带的另外一个软件“写字板”打开文件,找到如下函数:

'******************************获取地理坐标*****

Function GetCurXY(ByRef tmpCurX, ByRef tmpCurY)

Dim n, i, strNum, strXY, strT

Dim Color, ColorR, ColorG, ColorB

tmpCurX = 0: tmpCurY = 0

x0 = ScreenWidth - 147

y0 = 25

以上函数里面的X0的值就是数字的X坐标,跟我们上面是吻合的,可是,下面为什么是25,而不是我们刚才看到的24呢?这牵涉到180版本更新的问题。在170版本里,坐标是25的,那时的猎手是正常的;而到了180版本之后,猎手无法使用了(一开挂就会显示“错误:坐标色差,尝试使用黑白小地图...”,当180版本新推出来的时候,好多朋友在论坛里提问:为什么我以前使用猎手正常,现在却提示“错误:坐标色差,尝试使用黑白小地图...”,我已经使用黑白小地图了啊…),原因就是游戏界面上的数字、汉字都向上移动了一个像素点的位置,170版本之前的游戏,坐标数值的Y值是25,现在变成了24,X值没有改变。同样的,汉字的位置也向上移动了1个点,原来的Y值是5,现在要改成4,才可以正确识别小地图的名字。

我们接着看此函数的下面的内容:

For n = 0 To 7

For i = 0 To 4

Color = elColor(x0 + i, y0 + n)

ColorR = CLng("&H" + Right(Color, 2))

ColorG = CLng("&H" + Mid(Color, 3, 2))

ColorB = CLng("&H" + Left(Color, 2))

If ColorR - ColorB > 64 And ColorR - ColorG > 64 Then

Color = "1"

Else

Color = "0"

End If

strT = strT & Color

Next

Next

程序外面是一个循环,从0到7,一共循环8次,表示要读取8行,完整地把数字“5”读出来。

程序里面还有一个循环,从0到4,一共循环5次,表示每行读取5个点的颜色,这5个点,就与数字的第一笔是一一对应的。读到红颜色,表明这里有一个点,用“1”代表,没有读到红颜色,用“0”代表。

现在大家应该能够明白了吧:一次读1个点的颜色,一共读40次,从而完整地把5×8点阵的这个数字读出来了。我们看到的是数字“5”,你可以仔细的数一数,这40个点的颜色就是“01110”。

看到这里,你应该能明白,通过颜色确实能够“识别”数字了吧。

按照上面的顺序,在读出来“5”之后,我们在X值增加6点,Y值不变的情况下,继续读下一个字,第二个是“5”,然后第三个是“4”,第四个是小数点等等。我们可以认为:“正常的”

的坐标值是0-9,以及负号(-),读到小数点,表示X坐标、Y坐标的分界线了,读到红色的符号“]”,表示坐标结束了。

现在,我们读到的字符串是

554.2223

先利用字符串搜索,找到中间的小数点,把小数点前面的字符串“554”转换成数字“554”,然后把小数点后面的“字符串”也转换成“数字”,现在,利用脚本实现“识数”的功能已经实现了。

下一课,我们介绍如何识别“汉字”。可以预先提示的是,小地图上面的汉字坐标,Y轴也是固定的,但是,汉字的X轴却是变换的,读“汉字”比读“数字”稍微复杂一点了。数字的X值、Y值都是固定的,汉字的Y值固定、X变换,垃圾石头过滤的时候,显示出来的那些汉字、数字,X值与Y值都是变换的,我采取逐步加大难度的方式讲解,相信你能够看懂――前提是,你首先要把最简单的读“数字”的方法看懂。

好啦,先讲到这里吧。

[教程] 冷血课堂2--如何通过读取颜色来“认识”汉字?

上一课,我介绍了如何通过脚本来“认识”数字。还记得数字是什么格式的吗?是5×8点阵的。今天,我们继续讲脚本如何“认识”汉字――同样的方法,通过“点阵”来识别。“点阵”是所有颜色挂的核心。

另外需要说明的是,写这个帖子是给那些正在使用猎手的脚本,对脚本好奇,又不明白其原理的朋友看的。如果你能从对游戏的痴迷转换到对脚本感兴趣,那是我最高兴的事情了。关于外挂,其实有很多的写法:有写封包拦截外挂的(早期网络游戏传奇使用封包拦截的最常见,在赌场里,先拦截游戏客户端发出的“封包”,把它改成一定中奖的信息,然后再发送给服务器,那么你在赌场里就一直中奖了,这就是早期的一种刷钱外挂);有修改游戏客户端的(热血江湖内置了“跳舞”的动作,不过现在没有开放给大家使用,通过修改我们电脑上的客户端部分字节,可以达到开放跳舞功能的目的);有读取内存数据的(按键精灵就支持内存数据的读取);还有“写内存”的(比如,我们在游戏画面上看到有3个怪物,那么某个内存地址处,就有这3个怪物的“名单”,也记录了这几个怪物的“坐标”。现在,假如出现一个新怪物,那么刚才的“名单”里就多出一个地址来了。外挂马上把那个地址“写”入鼠标“点击”的地址――这就使服务器认为:你的鼠标已经“点击中了”刚刷出来的怪物了。这种外挂,手动抢怪都抢不过它的)。这些话我以前就讲过,可惜兄弟论坛改版之后,以前的技术帖子,都不知从何找起了。好象每个人的名字里面,也仅仅显示最近一个月来的帖子,再往前一点的帖子,就自动屏蔽掉了,让新人找帖子好累。

好啦,那些都是题外话,都跟我今天讲的内容无关,我讲的是如何通过屏幕颜色达到“识字”的目的。

还是以小地图为例。小地图上方,显示有当前地图的名字,见下图(放大8倍的),显示的是“泫勃派”。

作为我们中国人,当然是认识这几个字的,脚本又怎么认识它呢?看过我前一个帖子“冷血课堂1--如何通过读取颜色来认识数字?”的朋友,应该对“点阵”的概念有了初步的认识吧?坐标数字显示的是5×8点阵,而这几个汉字显示的是11×11点阵(这个要你自己去数一数了。在热血江湖游戏里面,还有13×13点阵的汉字)。当然,颜色也变化了,不再是红色,而变成了“蓝色”,采取同样的操作方式进行各种测试,我们可以发现,这几个汉字,它的Y坐标是固定的,170版本之前,是“5”,180版本之后,显示的字往上移动了一个点,Y值变成了“4”,整个字体的位置偏上了1个像素点。个人觉得,往上移动1个点之后,界面有点不协调,还是以前170版本的字体显示的位置比较好看些,是居中的。

好啦,话不扯远了。现在难点1是:这些汉字有多有少,有3个字的“泫勃派”,也有5个字的“柳善提督府”,第一个字的坐标不一致(Y轴是一致的,就是在同一个横排面上面,但是左右的宽度不一样)。难点2是:“柳善提督府”与“柳正关”的第一个字都是“柳”,

如果只通过第一个字来识别的话,你不知道“柳”代表的到底是哪里。

猎手是如何解决这两个难题的呢?

那么脚本该如何解决上面这2个问题呢?首先,猎手增加一段程序,在上图那个白色的小框里,“从左向右”寻找“蓝色”的点,找到之后,那个点所在的“汉字”,就是第一个字。

其次,猎手通过读第二个字的办法,达到“避开”这个“柳”字的目的。在游戏的早期,只有5个地图,这5个地图的第二个字是不一样的,当然,现在有点麻烦了,即有“神武门”又有“百武关”,第二个字都是“武”,采取只读第二个字的方法,就有问题了。读者朋友们可以考虑一下,用什么办法可以明确区别所有的地图名字呢?是不是要读全部的字?如果要读全部的字,当然是可以区别各个小地图的名字,可是速度就会慢一点了,5个汉字,需要读取121×5=605个点的颜色。

打开文件:

'***********************************************获取小地图名称*****

Function GetSmallMapName(ByVal lngStart)

Dim Color, ColorB, n, i, strNum, strT, lngTmpFound

Dim x0, y0

x0 = ScreenWidth - 112

y0 = 5

lngTmpFound = 0

For i = 0 To 19

For n = 0 To 10

Color = elColor(x0 + i, y0 + n)

ColorB = Left(Color, 2)

If ColorB > "8F" Then

lngTmpFound = 1

Exit For

End If

Next

If lngTmpFound = 1 Then Exit For

Next

x0 = x0 + i + (lngStart - 1) * 12

y0 = 5

strNum = 0: strT = ""

For n = 0 To 10

For i = 0 To 10

Color = elColor(x0 + i, y0 + n)

ColorB = Left(Color, 2)

If ColorB > "8F" Then

Color = "1"

Else

Color = "0"

End If

strT = strT & Color

Next

Next

前面一半,作用就是找到“蓝色”的点。找到的这个点,就是属于第一个汉字的一部分。

然后,出现以下的赋值:

x0 = x0 + i + (lngStart - 1) * 12

y0 = 5

参数lngStart,在脚本里是取的2,这就表示,找到第一个汉字之后,向后(也就是向屏幕右侧)移动12个像素点――也就是指到第二个汉字的第一个点了。

刚才讲了,汉字是11×11点阵的,也就是要取得121个点的颜色,根据每个点的颜色不同,脚本区分不同的汉字。后面有两个循环,都是从0到10,代表循环11次。颜色以“蓝色”大于“8F”为标准。大家有兴趣的话,自己去归纳那几个汉字的颜色有什么特点吧。

先看小地图的第二个字“勃”字,它的第一排的11个点,是怎么分布的了?还是用“1”表示该点有“蓝色”,用“0”表示该点不是“蓝色”,那么“勃”字最上面那一排的11个点,表示成“”。接着,我们找出第2排、第3排、第11排的各个点阵,然后排成一长串,就是“111”。这里共121个数字,代表121个点的情况。只要脚本跟上面的点阵吻合,就表示读取到的汉字,就是“勃”字。其它的字同理。

留给大家一个思考题:能不能对读汉字的点阵进行简化?由于地图而对种类就那么10余种,没必要把一个汉字完全读完,也就是没必要读121个点,没必要那么“精确”,只要读出前面几笔,应该就可以马上判断出是什么汉字了,因为可选的汉字,就那么十余个而已。

[教程] 冷血课堂3--如何通过读取颜色来“过滤”垃圾石头?

前面2课的内容,都是基础。没有前面2课的基础,你是无法理解这一课的内容的。

我们先“模拟”一下在游戏里的操作:先看看是什么石头(假设是寒玉石),然后看是什么类型(生命力),接着看是什么属性(15):包裹里面是一颗生命力15增加的寒玉石。接着,跟我们预先设置的条件比较:我设置的是生命45以下(含45)自动丢店,所以,脚

本自动就把它丢店。如果是一颗生命力50的寒玉,那么就不丢店了。

以上就是脚本运行的流程,已经完全在游戏里测试通过,目前能够过滤的有全部的7种金刚石、5种寒玉石、4种混元金刚、3种冰魄寒玉、强化石。兽灵丹、玛瑙石比较少在游戏里出现,所以懒得去写了,原理一样、方法一样;热血石还在收集品种,种类实在是太多了,有朋友建议只留下货币10%、升级1%,其它的都丢店。当然了,只要学会了怎么“读取”石头属性,脚本如何写是你的事了,你想丢什么石头就丢什么石头。下面,我就以一颗“生命力15的寒玉石”为例,讲一讲脚本如何写。

首先找到脚本中卖垃圾的地方,打开“热血江湖挂机升级”,找到:

//获取包裹内物品情况

VBSCall GetAllOfBag()@<>

VBSCall GetAsaleOfBag()@<>

//卖东西

VBS BagN=StartSN-1

VBS BagX=0:BagY=0

While BagN<36

VBS lngEmpty=1

VBS BagX=(BagN Mod 6)*33+ScreenWidth-210

VBS BagY=(BagN6)*33+366

MoveTo BagX BagY

Delay 64

VBSCall GetStoneOfBag()@<> //新增加的函数

If picBag(BagN)=1

LeftClick 1

Delay 320

MoveTo CenterX+82 CenterY+150

Delay 64

LeftClick 1

Delay 900

MoveTo ScreenWidth-45 531

最关键的是这一句:

If picBag(BagN)=1

在猎手的脚本里,如果等于1,表示这就是一个垃圾,应该丢店;如果等于0,表示留在包

裹里,既不丢店也不存仓;如果等于2,表示存仓。

打开文件,找到:

'判断必须保存的物品

For pi = StartSN - 1 To 35

pX = (pi Mod 6) * 33 + bagLeft

pY = (pi 6) * 33 + bagTop

If picBag(pi) = 1 Then

pXY = c(pX - 5, pY, pX + 38, pY + 33, "Images_Bag石头", 0.9)

If pXY > 0 Then picBag(pi) = 2

End If

Next

For pi = StartSN - 1 To 35

pX = (pi Mod 6) * 33 + bagLeft

pY = (pi 6) * 33 + bagTop

If picBag(pi) = 1 Then

pXY = c(pX - 5, pY, pX + 38, pY + 33, "Images_Bag石头", 0.9)

If pXY > 0 Then picBag(pi) = 2

End If

Next

说明:_Bag石头,就是“寒玉石”的图片。原脚本的意思是:如果是“寒玉石”,就一定存仓(设置picBag(pi) = 2)。

现在,我把picBag(pi) = 2修改成picBag(pi) = 4。“4”这个值,由函数对比寒玉的图片得到的,目的是传递给脚本,脚本发现某个格子的值等于4了,就知道这是一颗寒玉石了。

第一步,让脚本知道包裹里某个格子里是一颗寒玉石,这个目的实现了。

接下来,要读出是什么类型的寒玉石。看下图

当我们把鼠标移动到寒玉石上面的时候,会出现一个说明框,说明框里面就有石头的属性。现在,我们用自己的眼睛,可以看出来,是“生命力 15 增加”。如果用脚本来“看”,该怎么“看”呢?当我们把鼠标左右移动的时候,那个属性框也是左右移动的。当我们把鼠标上下移动的时候,属性框也是上下移动的。

这时,就是我第一课讲的一个非常重要的概念“基准点”了。尽管“生命力 15 增加”那几个字坐标并不固定(它的坐标随着鼠标的移动而变动),但是,它们的坐标却是与一个“基准点”有关联!那就是“鼠标的位置”!我在这里可以告诉大家,“生命力 15 增加”中,第一个字是“生”,它的左上角第一个点的坐标假如是X1,Y1,鼠标所指的坐标假如是X2,Y2,它们存在如下关系:

X1=X2-某个数值

Y1=Y2-70

也就是说,在Y轴上,属性框与鼠标坐标相差70个像素点,在X轴上,由于属性的文字长短不一,并不是一个固定的数值。现在大家回忆一下第二课的内容,在第二课里,冷血教了大家怎么“识别”汉字,现在,我们可以把那个技术使用上了。我们当时要识别的小地图的汉字,是不是也属于“文字长短不一”呢?有3个字的“泫勃派”,也有5个字的“柳善提督府”,还记得我们当时怎么找到第二个字的吗?在设计垃圾石头过滤的时候,技术是一模一样的。

我们事先已经知道,寒玉有5种,每种的第一个字都不一样,我们就以第一个字来区分寒玉石。(读取小地图名字是以第二个字来区分的,由于有2个地图的第一个字都有“柳”字,猎手就取第二个字来比较了)。

这里,我不再重复说如何读取汉字了,只是把流程再介绍一下:

在里面,增加2个函数,一个叫做“GetStoneOfBag()”功能是获取包裹内石头品种,也就是一旦发现picBag(pi) = 4,表示包裹此位置是一个寒玉石(我设置的金刚是3,寒玉是4,混元是5,冰魄是6,强化是9),于是就读出来那个“生命”的“生”字;第二个函数是GetStoneNumOfBag()功能是“读数字”,那个“15”的第一个点,从“生”字后面42个像素点开始读。

玩过“动态地址”的朋友可能好理解一点,如果以前没有在这方面思考过,可能难于理解。那么我就再重复罗嗦一下:

“15”这2个数字,虽然位置“千变万化”,但绝对“有章可循”:

1,先得到鼠标的坐标(这一点应该没有人说做不到吧?)

2,把鼠标的Y坐标减去70,得到“生”字的Y坐标,“生”的X坐标采取从左往右的方法“搜索”,第一个符合“规定颜色的点”就是。所谓“规定颜色”,小地图的地理坐标数字是“红色”,小地图的汉字是“蓝色”,这里属性说明也是一种“蓝色”。至于具体是多少,你们抓点看看就知道了。

3,知道了“生”字的坐标,然后往右侧移动42个点(Y值不变),就得到了“15”这个数字的坐标了。

4,把读出来的字符串转换成“数值”,与我们设置的默认值“45”比较,15<=45,所以,原来picBag(BagN)=4,现在使picBag(BagN)=1。还记得为什么要使picBag(BagN)=1吗?我们在前面,已经说过了,picBag(BagN)=1是垃圾要卖,picBag(BagN)=2自动存仓;picBag(BagN)=0保留在包裹里。

主要的设计思路,我已经讲完了。有几个要注意的地方:

1,卖寒玉的时候,会有个“属性物品是否卖掉”的提示框,你要抓个图,如果出现这个对话

框,就单击“确认”键。

2,我讲的只是寒玉这一种石头,当其它的石头也要卖掉时,需要多设置一些“临时参数”。数十种的石头,需要数十个参数,为了简单,可以使用数组,例如stone(40),每个参数表示每个石头的状态。

3,如果要把脚本交给别人使用,最好是完善一下“_用户自定义设置器.hta”文件。这个文件就是为了简化猎手的设置而写的。

讲到这里,如何不使用插件,而达到垃圾石头的过滤的方法,就讲完了。

在这里,利用这个帖子,我讲一点题外话。我2005年刚接触热血江湖的时候,也是被朋友们带去网吧玩的。那时后玩游戏,没有任何的辅助工具,也没有自动武功的说法,通常是连续几个小时反复按F1键,玩到手都抽筋。后来才得知有一个“按键精灵”可以帮我们“按”键盘,接着又发现可以通过“读颜色”而自动红蓝……就这样,一步一步接触到了按键精灵,接触到了脚本的写作。最近,有朋友问,冷血,是不是一个什么专门找游戏BUG的论坛的冷血,我说不是。我以前也没有听说过有那么一个论坛,昨天还专门去看了看,原来,那个论坛的管理员也叫做“冷血”,表面上是给大家提供游戏的BUG,实际上每个用户先要“上交”一个游戏BUG给他们,这算盘可打的真好。冷血在这里再次声明:本人2005年开始在游戏里使用这个名字,而且我发现游戏里有很多人使用这个名字,与那个BUG论坛的冷血,不是同一个人,我也不认识他。所以,我可从来没收过别人1分钱(为了调试脚本,曾经在游戏里使用过“四大名捕老千”给的武器、装备、银符、五色,借这个地方对他表示感谢。垃圾石头过滤的功能,当时也是应他的要求加进去的),当然,如果有人要捐款的话,我也不反对,你可以跟论坛管理员联系,捐三五个论坛金币就行了,不要太多了,呵呵。

将近半年没来论坛了,发现论坛里学技术的不多,大多数人还是要什么“无敌”,BUG之类的。没来的原因其实也很简单,上班比较忙了。这次回来,就想把我知道的一点东西教给愿意学的朋友,因为180版本的热血江湖,“无敌”的命令将一直有效下去,目前的无敌方式有2种,一是GM预留命令设计BUG导致的无敌,二是地图切换设计BUG导致的无敌。17GAMES根本就无力处理、也无权处理游戏主程序(他仅仅是个代理商而已),现在也在等待2.0B版本的推出,我估计,2.0之后,无敌会失效的。我也没有测封的账号,只看过几张2.0的游戏界面,发现变化很大,猎手可能将失去它的市场。到那时候,那些使用猎手的朋友,何去何从?

只有掌握了脚本的原理,那么不论热血江湖怎么改版,对你来说,不就是修改几个坐标、重新抓几张图片吗,实在是太简单了。猎手将来可能遇到的2个最大的问题是:游戏屏蔽“按键精灵”、游戏中出现“随机答题系统”,那个时候,大约才是猎手退出历史舞台的真正的日子。起码现在猎手还是安全的,嘉年华都不封,更不会封按键精灵了。

[教程] 冷血课堂4--如何来“过滤”强化石?

这篇帖子,本来也是属于第三课的内容,不过,由于强化的显示特点有点特殊,所以单独把它拿来写一写。

关于把强化当垃圾来卖的设置,很早以前有朋友问过我,我由于觉得强化丢店太可惜,也就没有多想脚本的问题。后来由于设置了垃圾石头过滤的内容,发现仓库里强化太多了,有时一个晚上,可以挂近百个强化,而去卖强化又很耽误时间,花2个小时去卖强化,不如直接丢店,再把这个时间拿去挂机合算,呵呵,确实如此。于是才有了“强化丢店”的想法。

强化的丢店,有2种方法可以实现。先回顾一下以前的方法,由于强化只有一种“外形”,所以,可以把强化的显示图片,改成“垃圾图片”,也就是先进入datasinterfaceITEM目录,把2000000000.d2s 文件复制一份,然后删除800000006.d2s文件,再把刚才复制的那个文件改名成800000006.d2s。这个时候你进入游戏,就会发现,原来显示的强化石的图片,现在也显示成为一串钱币的图标了。

我在这里介绍第二种方法,不用修改图片。也就是说,你在游戏里,看见的依然是强化的图片,但是,脚本会自动把它丢店了。这个方法,其实思路还是前几课讲的思路,在文件里,本来就有判断是否是强化的功能,可能大家没注意到吧:

'***************************************获取包裹中物品的位置*****

Function GetAllOfBag()

Dim pXY, pX, pY, pi, bagLeft, bagTop

Dim HpMpColor, mColorR, mColorG, mColorB, lngBagTmp, lngBlueCount

bagLeft = ScreenWidth - 228

bagTop = 353

'判断是否有东西

……………….

'判断必须保存的物品

For pi = StartSN - 1 To 35

pX = (pi Mod 6) * 33 + bagLeft

pY = (pi 6) * 33 + bagTop

If picBag(pi) = 1 Then

pXY = c(pX - 5, pY, pX + 38, pY + 33, "Images_Bag石头", 0.9)

If pXY > 0 Then picBag(pi) = 3

End If

Next

For pi = StartSN - 1 To 35

pX = (pi Mod 6) * 33 + bagLeft

pY = (pi 6) * 33 + bagTop

If picBag(pi) = 1 Then

pXY = c(pX - 5, pY, pX + 38, pY + 33, "Images_Bag石头", 0.9)

If pXY > 0 Then picBag(pi) = 4

End If

Next

For pi = StartSN - 1 To 35

pX = (pi Mod 6) * 33 + bagLeft

pY = (pi 6) * 33 + bagTop

If picBag(pi) = 1 Then

pXY = c(pX - 5, pY, pX + 38, pY + 33, "Images_Bag石头", 0.9)

If pXY > 0 Then picBag(pi) = 9

End If

Next

原版的文件里,“_Bag石头”就是强化的图片,在这里,我把它设置成等于9。原版是等于2。

然后打开文件“_热血江湖挂机升级”:

//获取包裹内物品情况

VBSCall GetAllOfBag()@<>

VBSCall GetAsaleOfBag()@<>

//卖东西

VBS BagN=StartSN-1

VBS BagX=0:BagY=0

While BagN<36

VBS lngEmpty=1

VBS BagX=(BagN Mod 6)*33+ScreenWidth-210

VBS BagY=(BagN6)*33+366

MoveTo BagX BagY

Delay 64

If picBag(BagN)=1

LeftClick 1

Delay 320

MoveTo CenterX+82 CenterY+150

把:If picBag(BagN)=1

改成:If picBag(BagN)=1 or picBag(BagN)=9就可以了。

现在你玩游戏的时候,强化石还是显示成正常的图片,但是卖垃圾的时候,会自动丢店了。以后不想卖强化的时候,把If picBag(BagN)=1 or picBag(BagN)=9改回If picBag(BagN)=1 ,就好啦。

这一课的内容很简单,如果你同时写了垃圾金刚等等石头的过滤函数,那么也可以在那个函数里对强化的属性进行处理,放在一个函数里处理一类事情,脚本会比较清晰。

大家回顾一下我在第三课讲的内容,要增加一个函数

VBSCall GetStoneOfBag()@<>

我们先要增加一个参数,假如叫 qianghua,现在设置qianghua=0是自动存仓,qianghua=1是自动丢店(这里随你自己设置了)。

那么GetStoneOfBag()这个函数里最主要的一句语句就是:

If picBag(BagN) = 9 And qianghua = 1 Then picBag(BagN) = 1

解释:如果包裹的属性是强化石头(If picBag(BagN) = 9),同时你又设置自动卖强化(qianghua=1),那么 picBag(BagN) = 1。picBag(BagN) = 1会怎么样?我这里不用再重复了吧?这样,就相当于有一个设置的“开关”了,接着把“_用户自定义设置器.hta”完善一下,那么使用的时候就很方便了。相对于修改贴图的方法,游戏显示界面会友好一些吧。

本文标签: 脚本游戏坐标颜色使用