本文介绍的方法适用于可以注入JS的浏览器,如谷歌浏览器(一些谷歌内核的浏览器也可以,如彩云极速游戏浏览器)、火狐浏览器等。谷歌浏览器不需要安装任何插件,而火狐需要安装firebug插件才可使用。

  网页游戏《英雄无敌王国》有宵禁的存在,即从凌晨1点钟到早上9点钟这段时间任何部队的世界移动都会以扎营形式暂停,而单英雄行动(如英雄侦察)和外城行动不受影响。

  而英雄侦查营地可以获得一定的英雄经验,由此产生一个可以刷将的BUG,即可以在这段时间里不断派英雄侦察营地。

  由于英雄到达营地需要一定时间,所以侦查的营地离英雄所在城越近越好。使用小号或在附近玩家的帮助下,让其在接近午夜1点的时候攻击或围你的城。这里出发的时间点是关键,幸好围城可以看到到达目标城市的时间,如下图中完成时间即是到达目标城市的时间,以这里的时间1时18分为例,从凌晨1点往前推1时18分,即11点42分,这就是最佳的出发时间。你可以在11点41分30秒左右的时间开始不断打开围城界面(即下图中的界面),当下图中的0次扎营变成1次扎营的时候,马上点击战斗,这个时间围城部队会在凌晨1点时到达你城市位置,但是由于宵禁而无法开始围城。长达半分钟左右的不断打开围城界面会有点小累,但是这样可以将你英雄侦查的移动时间控制在尽可能小的范围内。本人曾经弄出过3秒的移动时间,一般是3-7秒左右。

  以上步骤成功之后,你就可以暂时休息一下了,可以将英雄全都调到被围的城市,等到凌晨1点钟开始刷将。刷将步骤很简单,就是选择英雄,点击营地打开营地操作界面,点击侦查然后确定。如下图中点击望远镜后再点击勾按钮即可。

  以上是整个刷将的原理和过程介绍,不是只有宵禁时才能刷将,只是宵禁时刷将效率实在太高!白天也可以侦查城市或营地,但是一般城市和营地离英雄所在城市都会有一段距离,移动时间太长。

  纯手工操作刷将太累当然不大现实。一般玩家刷将使用的是按键精灵模拟鼠标操作,这也是我们联盟的盟主教我的方法。这个方法的好处是解放了双手,但是也有几个缺点:

  1) 占用了电脑,你无法在刷将的同时做别的操作,如游戏的其他操作(升级和建造等)、看看小电影什么的;

  2) 按键精灵脚本对一些有编程经验或网络老鸟来说比较简单,但是完全没有编程经验或是对电脑本身就不怎么熟悉的人来说就有些困难了。而且脚本几乎没有重复使用的可能性,因为每次使用的浏览器窗口大小可能不一样,滚动条位置不一样也会导致界面特定位置不一样,最主要的是营地在屏幕中的位置基本都不一样。所以每次刷将前基本都要重新调整脚本。

  3) 由于按键精灵是对网页界面进行操作,所以网页中的卡顿也会影响刷将效率。比如有时某个英雄会停留在侦查状态一直不更新,那么这个英雄接下来就无法再进行侦查。一般情况下我们刷新一下网页就可以了,但是在刷将过程中,特别是后半夜我们可以已经休息了,也就无法处理了。

  本人在使用按键精灵刷了两次将后感觉效果勉强还可以接受,但是还不够理想。于是从游戏的JS代码入手研究,写了一段自动刷将的JS代码。尝试之后效果比按键精灵要好不少,就拿出来分享一下。

  这里提一下本人玩这个网页游戏的原因。因为本人也是英雄无敌系列的爱好者,而且此作也是本人所知的唯一一个完全使用JS技术的网页游戏(这样说应该会显得本人有些孤陋寡闻),一开始玩这个网页游戏就是为了研究它的实现方式,之前对游戏的客户端JS代码已经有了一定的了解,对游戏的操作、数据格式和传递方式都大概清楚,所以很容易就找到了问题的关键。

  客户端使用HOMMK.elementPool保存游戏中用到的DOM模板和数据。

  在firebug中运行如下代码即可查看到许多游戏运行时保存的数据;

1 console.debug(HOMMK.elementPool);

如下图所示

  其中红框所示即是我们需要用到的玩家的英雄列表,这些数字是英雄的ID,虽然不是我们需要关心的。

  

  进入一个hero节点,英雄数据放在content属性中,其中的_currentSlaveActionType表示英雄当前的动作类型,图中的IMPROVE_MINE是升级金矿。

  还是先上脚本吧

 1 var masterHeroMoveId = 2000000;
 2 var params = {
 3     actionType : "HERO_SCOUT_HALT",
 4     actorType : "Hero",
 5     actorId : null,
 6     actionParams : masterHeroMoveId,
 7     actionParamsJSON : null,
 8     speedUpStep : 0,
 9     payMethod : null,
10     isChating : false
11 };
12 var myheros = HOMMK.elementPool.obj.Hero.values();
13 var scout = function () {
14     for (var i = 0; i < myheros.length; i++) {
15         var myhero = myheros[i];
16         params.actorId = myhero.content.id;
17         new HOMMK.JsonRequestHandler(HOMMK.JSON_ADDACTION_URL, {}).send(params);
18     }
19     setTimeout("scout()", 5000);
20 };
21 scout();

第1行中的数字是营地的ID,需要修改为相应的ID,营地ID获取方法在下面介绍。

第2-11行是发送侦查请求需要用到的参数,这个不需要修改。

第12行是获取当前的英雄列表。

第13-20行声明一个侦查方法scout。这是一个比较暴力的侦查方法,即不判断英雄行动状态直接发送侦查请求,即使英雄已经在忙了,仍然发送请求,这时服务器会返回一个错误,但没什么影响(除非服务器会写操作错误的日志并进行分析,这时他们应该会发现你的异常操作)。

第14行循环读取英雄。15和16行可以合并,就是把英雄ID放到请求参数中。17行是发送侦查请求。第19行是定时重新调用侦查方法,单位为毫秒,这里的5000是指每5秒发送一次侦查请求。

第21行是最开始的启动侦查。

本来写的是没有这么暴力的脚本,即会先判断英雄的行动状态,只对空闲英雄发送侦查命令,但是发现在发送大量请求之后客户端的英雄状态会错过更新时间而一直停留在忙的状态,如此这个英雄就不能侦查了,在尝试了一些方法之后仍未解决,因此只好使用现在这个暴力的侦查方法了。

  下面是获取营地ID的方法,以谷歌浏览器为例,在浏览器中按f12调出开发者工具界面,如下图是谷歌浏览器(英文版)的界面:

打开其中的Network(网络)选项卡,其中的列表是游戏的请求信息,如果列表过多可以点击最下面工具条上的Clear(清除)按钮清空日志。然后点击要侦查的营地,这时会发送一个读取营地信息的请求,如上图箭头所示的getContent,点击这条日志会进入下图界面:

点击Response(响应)选项卡,这里的内容就是返回的营地信息数据,其中的masterHeroMoveId就是我们需要的营地ID。把脚本中的营地ID修改为这串数字。

 

接下来是使用脚本的方法。同样是在打开开发者工具的界面,点击Console(控制台)选项卡,在如下图箭头所示处粘贴修改后的脚本,再按回车键即开始运行脚本。

由于发送侦查请求的间隔可能远小于实际侦查所需时间,游戏中会不停地弹出英雄正忙的错误提示,如下图

这个可以不用理会,安心地去睡觉或看看小电影。

等到早上9点时,刷新一下页面,脚本就停止了。围城的英雄会由于所带兵力过于弱小而被擒,把他放了就好了。

看一看收件箱,满满的都是侦察报告,都快溢出来了:)

由于侦察报告太多,删除的时候可能会卡住,等一下就好了,一般一晚上就可以升到35-40级了。每次侦查获得经验和什么有关本人暂时还未弄明白。

 posted on 2013-11-16 18:37  ﹎敏ō  阅读(671)  评论(0编辑  收藏  举报