第三章主要说“脚本的注意事项”, “脚本入门的一些通用模块”,“图色与算法”,“人工智能”。其中会穿插一些很实用的代码,能看懂的更好,看不懂的可以百度。
写之前呢,说一下本人:
我还是个宝宝,真的!还是个任性的宝宝,从小爱数学,于是高考数学146.从小不大喜欢语文,所以语文91.考了个全国排名前60的大学的数学系。混了四年,对,你没听错,混!毕业后,突然喜欢上编程,自学了计算机,学了数据库管理,java。
工作第二年的时候,工资拿到一万多。然后,懒得做网页了,辞职了。自学了c#和Windows编程。每天自娱自乐,开心得很。
最近呢,尤其2019年上半年,公司大量倒闭,企业大量裁员,看到了好多人迷迷茫茫,哭哭啼啼。总觉得做点什么好,就决定写几篇文章。不求播撒光明于天下,只是不想众多穷苦黎民泯灭于黑暗。好好看,仔细想,多问多学。保住一日三餐,足够。
前两篇教大家如何在游戏里赚钱,这篇教大家一些简单的脚本知识。个人有三个建议:
第一,科技,服务于人民。不要拿去祸害社会。
第二,多学知识,少搞游戏。本事学成,进正规公司,做个软件工程师不好?能行走于阳光之下,何必潜行于黑夜之间。
第三,只要能保住温饱,永远不要停止学习。
如果有人想学脚本,想学编程,告诉大家三个原则,如果你满足不了,建议你别做。
第一:技术员永远走在科技的前沿,哪怕迎着失败和嘲笑。
第二:技术员永远保持着最冷静的心态和最淡泊的耐心。
第三:保持终生学习,并且,学会的一定要教别人。当然,这些都是题外话,不过也是真心话。
下面开始正文。
先建立一个前提,本文所说的脚本,是这样定义的:
一个角色攻击力1,一个boss血量1000,所以,这个角色想杀了这个boss,需要攻击1000次。目前市场上有两种替代人工的办法:
第一种,将人物的攻击修改成999999,杀这个boss,一刀。
第二种,模拟键盘鼠标,让鼠标自动点击这个boss1000下。
第一种属于作弊,会对游戏产生大量伤害,尤其是点卡游戏,我们说的脚本不包括这些。
第二种,不修改游戏内存数据,甚至不读取游戏的内存数据,做到玩家怎么干,电脑就怎么干,我们称为脚本。
如果这套思路做成的软件,不用在游戏上,用在自动化办公上或者工厂机械上,我们称为机械自动化或人工智能。
脚本的注意事项。
为什么这个先说,因为能写脚本的毕竟是少数,大部分的人都是买脚本用。这个模块,也可以告诉大家,什么样的脚本最好别买,什么样的脚本比较容易封号。所有的游戏脚本,都要有一个原则:“低调”。本来就是灰色产业,能多低调就多低调,越不引人注意越好,又不是相亲当英雄,搞得那么光明堂皇干嘛?
下面分10点详细说明。
第一个注意事项:脚本界面。
拿网易某个游戏来说,很多脚本的界面上有什么买鬼切草,巫医等和游戏有关的字符或图片。如果我是网易的程序员,在随便一个时间点,对电脑桌面截个图。Windows的底层函数:CopyFromScreen(new Point(X, Y), new Point(0, 0), bit.Size); 很容易就能做到。一旦看到你在用脚本,迟早封你!
第二个注意事项:脚本名称。
如果一个脚本的exe名字就叫网易xxx脚本,即使打开后界面上没有相关字符也没用,因为exe名称决定了你的程序在任务管理器里面的进程名称。而一台电脑的所有当前进程名称,也是很容易获得的,这个代码行数较多,就不贴出来,有兴趣的朋友可以百度。当然,也有隐藏进程的方法,但是exe名称改掉不是更好吗?
第三个注意事项:调用一些需要释放的函数或者类时,一定要记得释放。
比如声明一个bitmap。Bitmap bit = new Bitmap(width, height, PixelFormat.Format24bppRgb);用完之后,一定记得写上bit.Dispose();把它释放掉。不然,就会越积累越多。游戏变卡不说,很多检测程序都会注意这块。你内存一直飙升的话,别说反脚本程序,360都会检测出来并且提醒你。
第四个注意事项:调用的第三方插件一定要有讲究。
很多初学者学脚本的时候,喜欢用按键精灵+大漠插件,还不加外壳。对此,我只能说,自己写个程序练练手是可以的,用这种脚本进入市场,除了封号还是封号!为什么?因为知道按键精灵的人都知道,按键是用来干嘛的?写脚本的。大漠插件是用来干嘛的?提供公用函数,方便写脚本的。那大点的游戏公司会不知道?不封你,只是想把你养肥了再杀而已。这里,不是说不能用按键和大漠,用的时候麻烦写复杂点,加点保护,加点外壳,大漠还可以修改自身的特征码呢。
第五个注意事项:写模拟按键都是要写延迟的。
如果真的想把脚本用起来,建议延迟改成随机数。模拟点击1000下,每次间隔都是一秒,你的手有那么准?一查就知道是脚本再点啊。
第六个注意事项:少用多线程。
很简单的道理,正常人就一个脑子一双手,不可能多线程操作,一查就知道是脚本。对于有些游戏,却是必须多开,比如梦幻的新手任务,一般都是多开做,但是就算多开,也可以不用多线程啊,通过图色分析每个界面进行到哪一步了,建立一个优先级别,先操作哪个后操作哪个,绝对来得及,就算慢点吧,慢点咋了?能慢几分钟?封组号,重新练得多久?
以上6点说的是增加被封几率。下面说几个坑定被封的,建议碰都别去碰。
第一个:修改内存,其实呢,这个可以不说,因为大家基本都不干这种傻事。
第二个:截获数据包。违法,违法,违法。重要的事情说三遍。并且很容易被查到。
第三个;后台模拟,目前后台模拟有两种api,一种是sendMessage,一种是postMessage。Vb,vc,C++和c#是可以直接调用这两个api的,易语言和大漠插件是把这两个api封装了下。这两种api都是利用了Windows的通信机制,消息传递。很遗憾的是,几年前,csdn论坛上就有人写了一个帖子,讲述了正常的按键和后台按键的检测,并且方法不难,代码不多,所以游戏公司也能很容易掌握。
第四个:虚拟机,尤其是服务器上装虚拟机。这玩意,以前搞诛仙3的时候用的很爽,天龙八部也很爽,地下城有些时间也很爽。但是吧,我有个同学,在爱奇艺,年薪三四十万,技术比我高那么一点点。直接对我说,你要是搞游戏,虚拟机别碰,具体为什么没对我说,但是既然有大神说了,还是别碰比较好。
这4点为什么说坑定封呢?因为搞得太嚣张了,嚣张到如果你是游戏的运维人员,你也忍受不了。一般人,搞个几十台电脑,慢悠悠赚点小钱,对游戏本身影响真心不大,人家也就睁一只眼,闭一只眼了。脚本一旦用了这4点,相当于你想把别人的游戏一锅端了,你把别人往死里搞,别人不把你往死里搞?
脚本入门的一些通用模块。
不管你选择什么语言,只要你在Windows上做,你必然要用到一些api函数,很多新手觉得很难,找又找不到,用又不会用,然后放弃了写代码,继续跑去板砖。
最近抖音流行一句话:你若堕落,神仙也救不了你,你若坚强,绝处也能逢生。学编程,本身必须要有坚强的意志。当然,没人教确实很容易绝望,所以这里贴出一些代码,希望能帮到一些在没有足够条件下,却真心想学编程的小朋友和大朋友。
以下所有的api函数,只提供名称,具体应用,自己去百度,都能百度到。
第一步:获得游戏焦点,专业的说法,是获取句柄,百度上有各种方法,我给大家说两种最简单的。对于单窗口WindowFromPoint(int xPoint,int yPoint);返回参数是指定坐标的窗口句柄。对于多窗口,首先获取桌面句柄,GetDesktopWindow();然后遍历桌面的子句柄,EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam);通过名称筛选。
第二步,由句柄得出窗口的四角坐标,也就是界面的位置。先自定义结构体,public struct RECT
{
public int Left; //最左坐标
public int Top; //最上坐标
public int Right; //最右坐标
public int Bottom; //最下坐标
}
然后获取坐标GetWindowRect(hWnd, ref lpRect);这样你就能知道界面在屏幕的哪个位置,然后可以计算出鼠标的点击位置和找图的区域。
第三步,截图。分前台和后台,不建议大家用后台取色,所以这里只说前台。.CopyFromScreen(new Point(X, Y), new Point(0, 0), bit.Size);截屏函数。
第四步,模拟鼠标键盘。也是说前台。鼠标移动,SetCursorPos(int X, int Y);鼠标点击mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo);键盘:keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);延迟函数:T(1000);
其他:读取文件,ReadLine()。随机数,Random()。窗口最大最小化SetForegroundWindow(IntPtr hWnd);注册热键,RegisterHotKey();
有了这些函数,入门就简单的多了。但是这些只是基础,想写出完整的脚本,还需要很多。
图色与算法。
知道怎么让鼠标点击,却不知道点哪里,也没用。所以,判断信息对脚本很重要,说成最重要也不为过。常用的3种方法,截获数据包,读取内存,图色分析。
第一种方法,已经讲过,强烈不建议。
第二种方法,读取内存,现在的主流方式。基本流程就是找基址,找指针,然后通过函数ReadProcessMemory读取数据。这种方式蛮好的,但是呢,每次游戏跟新就要更新代码,就要重新找基址。对于一个团队,到没什么,对于散人来说,增加了不少工作量。并且,游戏对内存保护这块越来越严厉,动不动来个十几级的偏移。所以这里说一下图色分析,图色分析好多脚本都用到了,但是极少有脚本全程用图色分析,大部分都是一半图色,一半内存。
我写脚本,就喜欢全图色,为啥呢?写好之后基本不用更新,除非游戏界面发生变化。并且,全图色的,基本不封号。因为我们不读取内存,不碰后台,不碰多线程,全局鼠键模拟。不是说检测不到我们,只是我们很低调。但是全图色很难写,因为有些地方,确实,人都不好分辨,怎么去分析?这里,我们引进算法,相信很多人多多少少听过算法,但是不熟悉。
简单的来说,算法就是比较复杂的数学公式。区别是,公式是针对所有问题的,算法有很多是针对单个问题的。比如地下城,哪个怪离你最近?怎么选择最近的路线去接近这个怪?怎么单个消灭能达到最快?这些就可以用算法。再比如梦幻的新手任务,如果使用前台模拟,必然要用到优先度算法,确保完成任务的平均时间差不多。关于算法,往往涉及到核心问题的解决方案,这里不好多说,有兴趣的可以多研究研究。可以这么说吧,图色分析加算法,应该是未来几年高质量脚本的趋势。
人工智能。
个人认为,好的游戏脚本,就应该像人一样去操作,甚至像人一样去分析。反过来说,游戏的制作宗旨,是为了给玩家用,而不是为了反脚本。模拟人工,你永远能立于不败之地。那么我们先来讨论下人的分析思维。人的大脑是根据听觉视觉嗅觉味觉触觉等获取信息的。
对游戏而言,只有视觉和听觉。对于脚本而言,99%的信息靠视觉。我们重点谈论视觉,人的大脑,刚出生的时候,没办法分析文字,因为没有概念。至于视频,本身就是图片,只不过帧数比较快而已。所以,大脑分析最多的是图片。一张图片,并不是全部的信息有用。或者说,并不是每一块信息同等重要。
举个很污的例子,你在看片,更多的是在注意女主角,而不是男主,更多的是在注意女主的某些部位,而不是手指头发。那你为什么会养成这种分析习惯呢?因为我们的大脑,在长期的分析中,提取了很多模型。所以你知道一棵树是什么样,你知道一条狗是什么样。同样,在脚本中,我们也需要模型(鉴于商业机密和只是产权,这里只说建立模型的思路,不能写具体步骤)。
这个模型,可能是某一个对话框,也有可能是某个字。对于字库,是必须的,甚至是首要的,大漠插件有自己的字库,百度识别也有自己的字库,都可以直接去调用。但是我建议,大家建立自己的字库,虽然时间比较长,但是建成后,真心很好用。至于有多好用,参照第二章写商人的利润的那段。
当然,仅仅有字库,是远远不够的,还需要很多别的模型,比如npc和怪物。你的角色,如何知道身边有哪些怪物,大部分的作者用的是基址遍历。这种方法谈不上好与不好,我的评价是两个字:能用。除了基址遍历,我们可以用建模型的办法,每个npc都有特征,不然玩家怎么分辨?把这些特征抓住,转化成特征值,通过特征值,照样能知道身边有哪些npc。知道了界面上的字和npc,你还需要知道鼠标在哪里。
很多游戏的鼠标都有自己的样子,但是这些样子几乎是不变的,或者小范围变化。否则,玩家怎么识别?既然人能一眼看出来,那说明,这个模型不难建立。
建立模型,一般从找色开始,图片的像素,有像素值,有些地方是固定的,有些地方是规律变化的,抓住这些,也就抓住了建立模型的关键。有了模型,你就能让你的脚本像人一样,通过女主的表情就知道男主用了多大力。有了分析,还需要操作。人的操作,是有血肉的,而不是机械的,是休闲式的,而不是拼命式的。
有些人写脚本,一丁点时间都不浪费,让游戏里的角色一直打打打,杀杀杀,跑跑跑。还很自以为是的认为利润最大化了。嘻嘻,反正我不这么想,不封号才是利润最大化。所以我的脚本,跑跑停停,偶尔还故意点错,跑路偶尔跑偏,然后修正一下,打怪偶尔放错技能,然后多一回合。哎,我的利润真心没多大,就是比较省心,因为很少封号。
讲个笑话,以前有个游戏的某个道具可以连续吃,而我呢,吊儿郎当的写代码,导致偶尔会同时吃掉两个,把一些客户心疼的,不要不要的,然后让我改,我懒得改。然后有两个客户跑去用别人的脚本了,临走前还骂我一顿,说我垃圾,不负责,不为客户找想,不当家不知道柴米油盐贵。但是,过了半个月,就回来了。原因估计大家也能猜到。所以啊,人嘛,总是会犯错的,所以啊,脚本呢,也是需要偶尔犯错滴。
游戏这行,本来就是细水长流,想一夜暴富,还是去抄大蒜比较好。
2019年,游戏工作室建立三步曲,写了3篇,用了3天时间,你说你们要是不回复,对得起我大冬天敲键盘的手吗?
好了,写完了,明天又要敲代码了,至于这些文章能帮到多少人,尽人事,听天命吧。写首歪事送给大家,写完去给老婆洗碗。。。
劝君穷时少饮酒,一杯能解几斤愁?劝君闲时多上进,来日方长不可停。