战网中国

标题: 聊聊单机挂BOT的原因和我遇到的问题! [打印本页]

作者: bravheart037    时间: 2014-7-26 06:56
标题: 聊聊单机挂BOT的原因和我遇到的问题!
可能很多人都会说,单机直接导入吧!还挂什么BOT,多无聊啊.但是我想说,现在玩暗黑2的,多数已经是快要步入30的准大叔级人物了。既想玩暗黑这个经典的游戏,又实在没时间去一遍又一遍的无聊的刷刷刷了。有很多时间,刷来刷去确实有助于丧失对于一个游戏的乐趣!于是乎,我发现在在战网中国这里,有八神BOT,南瓜BOT,韩国BOT等一大批优秀的BOT,可以代替我们劳动!
有了这些BOT,配合单机的无限大箱子,既省去了繁重的MF体力劳动,又能体会到游戏的乐趣,还可以完成收集控的梦想!可以说是一举三得。
另外,为什么我选择单机挂BOT,第一,战网没有大箱子,虽然有自动倒装备到仓库的功能,但是还是需要建立很多很多ACC,很多小号。找东西虽然可以看XML文件,但是总不能单机一个无限大箱子方便!第二,单机可以很轻松实现/PLYAERS 8功能,不需要多开就可以实现多个人游戏的掉率(虽然/players 8只有5个人左右的NOdrop 率,但也够用了)
说了这么多,现在说说我遇到的问题:
1.bot放入stash(储物箱)是按照小箱子的大小去设计的,单机10*10的大箱子总是添不满!我想知道修改哪个文件可以实现BOT放满大箱子。请高手提供一个修改哪个文件夹里面的文件既可,我自己有一定的研究能力。
2.战网人物顺序是固定的,单机每次退出后,最后一个游戏人物会排到第一位。我想知道,人物顺序是由什么文件控制的,战网BOT可以(player1,player2,player3.....)按照人物位置多开好多个char一起mf,单机由于人物顺序变化,做不到这一点,请问有没有什么方法让单机人物顺序像战网那样固定不变!
3.我自己单机建立了一个战网,可以实现战网的所有功能,也可以实现BOT的teambot,倒仓库功能。但是我还是不太满足,我想让自己建立的战网实在单机的无限多页大箱子功能,请问如何做到?我会一定的暗黑相关TXT文件修改功能,可以实现战网的单页大箱子,无法实现多页大箱子。把大箱子补丁打好之后,自己建的战网也无法实现多页大箱子,请问,应该修改哪些文件?
问题较多!估计没几个会看完吧!但愿遇到有缘之人!
作者: xdd111    时间: 2014-7-26 09:58
太专业了
作者: ita    时间: 2014-7-26 10:43
人物顺序可以这么弄:
1.每个bot的人物位置都设置为第一位
2.挂每个人物前先用这个人物进一次游戏,让这个人物排在第一位
每个人物跑完一次新开游戏时,自己都会在第一位。
作者: 白色曼陀螺    时间: 2014-7-26 13:06
指点个研究方向:
1、ntbot的基本函数都在scripts\\libs\\common下边,比如你找的箱子相关函数,在NTTown.ntl文件中,
function NTT_ManageStash(invitem)
2、人物顺序想控制不太现实,那涉及到暴雪的程序修改了,但熟悉ntbot的话,靠判断人物名字也可以实现单机多挂,需要研究NTBot.ntj文件,修改其中的case 12部分。
3、我也不知道。不过如果仅仅是依靠修改mpq文件就能实现的话,可以在界面设置的cdkey选择那里选择你自己的mpq文件。
作者: bravheart037    时间: 2014-7-26 15:44
[quote=白色曼陀螺,104732]指点个研究方向:
1、ntbot的基本函数都在scripts\\libs\\common下边,比如你找的箱子相关函数,在NTTown.ntl文件中,
function NTT_ManageStash(invitem)
2、人物顺序想控制不太现实...[/quote] 请大神看下NTTOWN里面的这部分内容。我有点不是特别的懂!
function NTT_ManageStash(invitem) // default stash managing // 这句是:默认的储物箱管理
{
var i, x, y;                                                                                //定义三个变量i,x,y
var _items;
var _stashall;
var StashHeight = (me.gametype == 0) ? 4 : 8;                     //这句什么意思?箱子的高度?
var _ignorestring = _NTT_IgnoredItems.join();
var _ignoreitem;


if(!GetUIState(0x19))
return false;


if(arguments.length < 1)
_stashall = true;
else
_stashall = false;


if(!NTC_StashGoldFull() && NTC_MyGoldCarry() > NTConfig_MinGoldToStash)       //这部分好像是往箱子里面存钱的意思吧。
{
var _mygold = NTC_MyGoldCarry();


Gold(3, _mygold);


for(i = 0 ; i < 2 ; i++)
{
NTC_Delay(500);


if(_mygold > NTC_MyGoldCarry())
break;
}
}


var _stashspace = new Array(StashHeight);


for(y = 0 ; y < StashHeight ; y++)                                    
_stashspace[y] = new Array(6);


for(y = 0 ; y < StashHeight ; y++)
{
for(x = 0 ; x < 6 ; x++)                          //x<6是不是箱子的横向格数是6?
_stashspace[y][x] = 0;
}


_items = me.GetItems();


if(!_items)
return false;


for(i = 0 ; i < _items.length ; i++)
{
if(_items.mode == 0 && _items.itemloc == 4)
{
for(y = 0 ; y < _items.ysize ; y++)
{
for(x = 0 ; x < _items.xsize ; x++)
_stashspace[y+_items.y][x+_items.x] = 1;
}
}
}


for(i = 0 ; i < _items.length ; i++)
{
if(_items.mode == 0 && _items.itemloc == 0 && (_stashall || (_items.x == invitem.x && _items.y == invitem.y)))
{
if(_stashall)
{
_ignoreitem = (NTConfig_Columns[_items.y][_items.x] == 0);


if(!_ignoreitem)
{
if( _ignorestring.indexOf(_items.code) != -1 || NTSI_CheckItem(_items)[0] <= 0 )
_ignoreitem = true;
}
}
else
_ignoreitem = false;


if(!_ignoreitem)
{
_itemdone = false;


for(y = 0 ; y < StashHeight ; y++)
{
if(_itemdone)
break;


for(x = 0 ; x < 6 ; x++)                   //又一个x<6
{
if(_itemdone)
break;


if(_stashspace[y][x] == 0)
{
if((x+_items.xsize-1) < 6 && (y+_items.ysize-1) < StashHeight)
{
var _havespace = true;


for(m = 0 ; m < _items.ysize ; m++)
{
for(n = 0 ; n < _items.xsize ; n++)
{
if(_stashspace[y+m][x+n] == 1)
{
_havespace = false;
m = 4;
break;
}
}
}


if(_havespace)
{
if(NTC_ItemToCursor(_items))
{
for(n = 0 ; n < 80 ; n++)
{
if((n % 40) == 0)
me.ClickItem(0, x, y, 4);


NTC_Delay(100);


if(!me.itemoncursor)
break;
}


if(n < 80)
{
for(m = 0 ; m < _items.ysize ; m++)
{
for(n = 0 ; n < _items.xsize ; n++)
_stashspace[y+m][x+n] = 1;
}
}


NTC_PingDelay(200);
}


_itemdone = true;
}
}
}
}
}
}


if(!_stashall)
return true;
}
}


return true;
作者: bravheart037    时间: 2014-7-26 15:51
case 12: // Character Select
                var _time, _control;

                sendEventToOOG(D2NT_MGR_PRINT_STATUS, location.name, 0);

                for(_time = 0 ; _time < characterScreenTimeout ; _time += 500)
                {
                        _control = controlData.get(controlData.controls.characterSelect.textBox.characterInfo[me.charloc]);
                        if(_control && _control.GetText() != undefined)
                                break;

                        Delay(500);
                }

                if(_time < characterScreenTimeout)
                {
                        Delay(characterSelectDelay);

                        controlData.click(controlData.controls.characterSelect.textBox.characters[me.charloc], 0, 0, 1);
                        controlData.click(controlData.controls.characterSelect.textBox.characterInfo[me.charloc], 0, 0, 1);

                        // reset last game made, so it doesnt make a game immediately
                        inGameAt = 0;
                        setNextGameMake();
                }
                else
                {
                        controlData.click(controlData.controls.characterSelect.button.exit);
                        timeoutDelay(realmDownRetry*60*1000, location);
                }
                break;
对于CASE12里面的内容,更是看不懂了…………哎,发现自己什么也不会啊……。
作者: bravheart037    时间: 2014-7-26 15:58
[quote=ita,104716]人物顺序可以这么弄:
1.每个bot的人物位置都设置为第一位
2.挂每个人物前先用这个人物进一次游戏,让这个人物排在第一位
每个人物跑完一次新开游戏时,自己都会在第一位。[/quote] 很抱歉,我没太看明白你说的是什么意思。具体举个例子来说:我有两个char,第一位是sor,第二位是bhpal。按照你的做法,第一次先手动进游戏,让sor处于第一位置上,然后开启bot。再手动让bhpal进游戏一次,让bh处于第一位,再开bh的bot。是这个意思吗?
我怎么觉得这么做不好用呢?有时候sor的bot打完了,再进游戏的时候,此时就会选择处于第一位的bh了呢。
作者: ita    时间: 2014-7-26 16:20
[quote=bravheart037,104780]很抱歉,我没太看明白你说的是什么意思。具体举个例子来说:我有两个char,第一位是sor,第二位是bhpal。按照你的做法,第一次先手动进游戏,让sor处于第一位置上,然后开启bot。再手动让bhpal进游戏一次,让bh处于第一位,再开bh...[/quote] 就是按你举的例子做。
sor的bot打完保存退出时,系统会判定sor是最近一次使用过的角色,因而将其排在第一位。
我以前亲自测试过是可行的。
作者: 肥猫啊    时间: 2014-7-26 16:38
关于人物位置,试了好多办法,我是死心了,只有一个办法稳妥可用:每个角色单独设立一个暗黑文件夹,然后利用大箱子的更改存档路径功能,分别指定相应的存盘位置。也就是一个ACC一个人物,一个暗黑文件夹。

[SAVEPATH]
ActiveSavePathChange=1
SavePath=E:\\mygame\\Diablo II-SOR\\Save-sor
作者: 肥猫啊    时间: 2014-7-26 16:42
至于兼容大箱子,改变一下NTTown.ntl内的箱子行列数设置就行了。

[attach]7125[/attach]
作者: 肥猫啊    时间: 2014-7-26 16:43
至于BOT用多页大箱子。。。。哈哈,太贪心了也
作者: 白色曼陀螺    时间: 2014-7-26 17:54
x y分别是箱子的横纵坐标。
作者: bravheart037    时间: 2014-7-26 19:36
[quote=肥猫啊,104792]至于兼容大箱子,改变一下NTTown.ntl内的箱子行列数设置就行了。[/quote] 厉害。我看了你的文件,基本上就是把x坐标里面=6或者<6的都变为10,Y的坐标没看到改变呢?我参照你的改一改韩国BOT里面的,看看行不行。
作者: bravheart037    时间: 2014-7-26 19:46
[quote=肥猫啊,104791]关于人物位置,试了好多办法,我是死心了,只有一个办法稳妥可用:每个角色单独设立一个暗黑文件夹,然后利用大箱子的更改存档路径功能,分别指定相应的存盘位置。也就是一个ACC一个人物,一个暗黑文件夹。


ActiveSavePathChange...[/quote] 你说的我是这样理解的。比如有三个人物,需要建立三个暗黑文件夹,分别为:Diablo1,Diablo2,Diablo3。里面都有暗黑的完整程序(包括game.exe,各种mpq文件,各种dll文件,save文件夹,plugin大箱子文件相关程序)。分别用大箱子文件中的PlugY.ini指向各个save 文件夹,这样只需要一个D2nt程序,分别对应不同的game.exe,就可以每个char都是第一位的了!
作者: bravheart037    时间: 2014-7-26 19:47
[quote=白色曼陀螺,104806]x y分别是箱子的横纵坐标。[/quote] 谢谢,参照上面的大神的文件,我自己改了改,好像可以了。谢谢您的指导!
作者: bravheart037    时间: 2014-7-26 19:47
[quote=白色曼陀螺,104806]x y分别是箱子的横纵坐标。[/quote] 不过,你说的case12里面的内容,还是没太懂是什么意思……。
作者: bravheart037    时间: 2014-7-26 20:04
[quote=肥猫啊,104792]至于兼容大箱子,改变一下NTTown.ntl内的箱子行列数设置就行了。[/quote] 我把你的文件复制替换后,BOT还是只装原来大小的箱子,怎么回事?我试了韩国BOT和南瓜BOT,都不行呢。
作者: 肥猫啊    时间: 2014-7-26 20:31
我的是NT3.0,只要是NT应该就没问题。
韩国等BOT也都是演化过来的,底子还是NT。
作者: 肥猫啊    时间: 2014-7-26 20:38
[quote=bravheart037,104827]你说的我是这样理解的。比如有三个人物,需要建立三个暗黑文件夹,分别为:Diablo1,Diablo2,Diablo3。里面都有暗黑的完整程序(包括game.exe,各种mpq文件,各种dll文件,save文件夹,plugin大箱子文件相关程...[/quote] 对~!
[attach]7127[/attach]
作者: 肥猫啊    时间: 2014-7-26 20:40
[attach]7128[/attach]
作者: 肥猫啊    时间: 2014-7-26 20:43
大箱子正常使用,挂BOT用和战网没什么区别。
就是运气比较衰,至今没挂出31号,除了SOR都在走路,KP和乌龟,好在不用担心被办,随意CR。
作者: bravheart037    时间: 2014-7-26 21:28
[quote=肥猫啊,104840]我的是NT3.0,只要是NT应该就没问题。
韩国等BOT也都是演化过来的,底子还是NT。[/quote] 我的是NT3.1.我再试下……是不是就把原来的X=6改为X=10
作者: bravheart037    时间: 2014-7-26 22:11
[quote=肥猫啊,104845]大箱子正常使用,挂BOT用和战网没什么区别。
就是运气比较衰,至今没挂出31号,除了SOR都在走路,KP和乌龟,好在不用担心被办,随意CR。[/quote] function NTT_ManageStash(invitem)
{
    var i, x, y;
    var _items;
    var _stashall;
    var StashHeight = (me.gametype == 0) ? 4 : 8;
    var _ignorestring = _NTT_IgnoredItems.join();
    var _ignoreitem;

    if(!GetUIState(0x19))
        return false;

    if(arguments.length < 1)
        _stashall = true;
    else
        _stashall = false;

    if(!NTC_StashGoldFull() && NTC_MyGoldCarry() > NTConfig_MinGoldToStash)
    {
        var _mygold = NTC_MyGoldCarry();

        Gold(3, _mygold);

        for(i = 0 ; i < 2 ; i++)
        {
            NTC_Delay(500);

            if(_mygold > NTC_MyGoldCarry())
                break;
        }
    }

    var _stashspace = new Array(StashHeight);

    for(y = 0 ; y < StashHeight ; y++)
        _stashspace[y] = new Array(10);

    for(y = 0 ; y < StashHeight ; y++)
    {
        for(x = 0 ; x < 10 ; x++)
            _stashspace[y][x] = 0;
    }

    _items = me.GetItems();

    if(!_items)
        return false;

    for(i = 0 ; i < _items.length ; i++)
    {
        if(_items.mode == 0 && _items.itemloc == 4)
        {
            for(y = 0 ; y < _items.ysize ; y++)
            {
                for(x = 0 ; x < _items.xsize ; x++)
                    _stashspace[y+_items.y][x+_items.x] = 1;
            }
        }
    }

    for(i = 0 ; i < _items.length ; i++)
    {
        if(_items.mode == 0 && _items.itemloc == 0 && (_stashall || (_items.x == invitem.x && _items.y == invitem.y)))
        {
            if(_stashall)
            {
                _ignoreitem = (NTConfig_Columns[_items.y][_items.x] == 0);

                if(!_ignoreitem)
                {
                    if( _ignorestring.indexOf(_items.code) != -1 || NTSI_CheckItem(_items) <= 0 )
                        _ignoreitem = true;
                }
            }
            else
                _ignoreitem = false;

            if(!_ignoreitem)
            {
                _itemdone = false;

                for(y = 0 ; y < StashHeight ; y++)
                {
                    if(_itemdone)
                        break;

                    for(x = 0 ; x < 10 ; x++)
                    {
                        if(_itemdone)
                            break;

                        if(_stashspace[y][x] == 0)
                        {
                            if((x+_items.xsize-1) < 10 && (y+_items.ysize-1) < StashHeight)
                            {
                                var _havespace = true;

                                for(m = 0 ; m < _items.ysize ; m++)
                                {
                                    for(n = 0 ; n < _items.xsize ; n++)
                                    {
                                        if(_stashspace[y+m][x+n] == 1)
                                        {
                                            _havespace = false;
                                            m = 4;
                                            break;
                                        }
                                    }
                                }

                                if(_havespace)
                                {
                                    if(NTC_ItemToCursor(_items))
                                    {
                                        for(n = 0 ; n < 80 ; n++)
                                        {
                                            if((n % 40) == 0)
                                                me.ClickItem(0, x, y, 4);

                                            NTC_Delay(100);

                                            if(!me.itemoncursor)
                                                break;
                                        }

                                        if(n < 80)
                                        {
                                            for(m = 0 ; m < _items.ysize ; m++)
                                            {
                                                for(n = 0 ; n < _items.xsize ; n++)
                                                    _stashspace[y+m][x+n] = 1;
                                            }
                                        }

                                        NTC_PingDelay(200);
                                    }

                                    _itemdone = true;
                                }
                            }
                        }
                    }
                }
            }

            if(!_stashall)
                return true;
        }
    }

    return true;
}
我自己是这么改的,你看看对吗?不起作用呢……。
作者: bravheart037    时间: 2014-7-26 22:33
[quote=肥猫啊,104845]大箱子正常使用,挂BOT用和战网没什么区别。
就是运气比较衰,至今没挂出31号,除了SOR都在走路,KP和乌龟,好在不用担心被办,随意CR。[/quote] 可以把你的BOT上传或者发给我吗?或者加我QQ,教我一下。304310639.谢谢!
作者: bravheart037    时间: 2014-7-26 22:43
[attach]7132[/attach]我自己改的,不知道哪里不对,不起作用。请大神给予指正。
作者: 白色曼陀螺    时间: 2014-7-26 23:50
qq=11427125.可以解答基本问题,动脑筋和费事的事情不管。
作者: bravheart037    时间: 2014-7-27 07:12
[quote=肥猫啊,104845]大箱子正常使用,挂BOT用和战网没什么区别。
就是运气比较衰,至今没挂出31号,除了SOR都在走路,KP和乌龟,好在不用担心被办,随意CR。[/quote] 经过自己的研究,搞定了,确实可以填满了!谢谢!
作者: 肥猫啊    时间: 2014-7-27 07:41
目前与战网相比,存在的问题:
1)大约间隔5-10分钟才自动存档,所以非正常退出的话存档不及时。这也是为什么要分开每个人物一个文件夹,一个独立存档的一个原因,公用的话有时会造成存档更新不及时,丢失数据。
2)大箱子固然好,但人物独立,也就只能用拷贝箱子文件的办法,实现共享了。
3)局域网模式下,带人,合作什么的,在结束游戏时容易闪退。如1),造成丢档,所以最好带完人,留在游戏内,等看到存盘文件创立的时间刷新了,再退。
4)火炬地图的M与D不召唤怪,只有干巴巴的3个老怪,这点不如战网生动,但挂机打火炬也就相对方便些。
5)原始的PlugY.ini,CD的出现过于困难了,8小时都未必出一只。因此有必要把PAL的那个PlugY.ini改动一下。
[WORLD EVENT]
ActiveWorldEvent=1
ShowCounterInAllDifficulty=1
ItemsToSell=The Stone of Jordan
MonsterID=333
OwnSOJSoldChargeFor=100
InititalSOJSoldMin=200
InititalSOJSoldMax=3000
TriggerAtEachSOJSoldMin=1
TriggerAtEachSOJSoldMax=10
ActiveAutoSell=1
TimeBeforeAutoSellMin=1
TimeBeforeAutoSellMax=1800
这样最短1,2分钟,最慢4,5小时出一只,比较合理。手动打火炬时就很有可能遇到一个。
6)BOT的NT_GameMsgEvents判断屏幕信息的功能有问题,以至于像什么判断CD的功能不能实现。相对好解决,十有八九是语言核心文件不同所致,换回原版的应该就可以,现在怎么切换也都是汉化的。我的PAL现在还不能TP,等有了31号再搞吧。
作者: bravheart037    时间: 2014-7-27 15:45
[quote=肥猫啊,104921]目前与战网相比,存在的问题:
1)大约间隔5-10分钟才自动存档,所以非正常退出的话存档不及时。这也是为什么要分开每个人物一个文件夹,一个独立存档的一个原因,公用的话有时会造成存档更新不及时,丢失数据。
2)大箱子固然好,但人物独立,也...[/quote] 大神啊,你说的我似懂非懂的。不过改SOJ出DC那个我懂的。
第一,分开存档,其实就是N个暗黑+大箱子文件夹,要想共享物品,一般是BOT打到的先存到个人箱子的第2到N页,需要共享的时候转移到共享箱子里,然后 把共享箱子拷走(.sss结尾的那个文件)实现物品共享。
第二,我都是单机双开,手动自己带自己的小号。没发现什么丢失东西现象
第三,DC出现时间我一般设的时候长一点,需要打毁灭小符时候,就把时间设置的超短,进游戏就出DC,然后自己手动打个十多次。毁灭小符单机真的没战网那么精贵。
第四,火炬不会自动打,八神BOT在战网可以钥匙自动入库自动打火炬,但单机我都是BOT攒一大波KEY然后手动打,至今没出什么极品火炬。
第五,你说的NT_GAMEMSGEVENT,这一段是什么意思,我没懂。
第六,大神,你现在是BN呢,还是单机呢?
作者: 肥猫啊    时间: 2014-7-27 16:36
BN搞不动了,现在只在单机自欺欺人,而且还要努力欺的象些。
NT_GAMEMSGEVENT是NT的一个功能,用来判断屏幕的文字信息。。。例如:
function NT_GameMsgEvents(msg, type)
{
        if(msg.indexOf(\"Diablo Walks\") != -1)
        NTTM_CheckAct();
}
当判断到屏幕有CD出地表字样,立马回程。
作者: bravheart037    时间: 2014-7-28 13:29
[quote=肥猫啊,105075]BN搞不动了,现在只在单机自欺欺人,而且还要努力欺的象些。
NT_GAMEMSGEVENT是NT的一个功能,用来判断屏幕的文字信息。。。例如:
function NT_GameMsgEvents(msg, type)
{
        if(msg.i...[/quote] 能把你常用的BOT发给我一下不,我自己改完的NTTOWN,让BOT启用:cube功能的时候,总出现问题,常常捡了半箱子就停止不动了,我不知道问题出在哪里。干脆用你的BOT的了。自己改来改去总不成功。
作者: bravheart037    时间: 2014-7-28 13:30
[quote=肥猫啊,105075]BN搞不动了,现在只在单机自欺欺人,而且还要努力欺的象些。
NT_GAMEMSGEVENT是NT的一个功能,用来判断屏幕的文字信息。。。例如:
function NT_GameMsgEvents(msg, type)
{
        if(msg.i...[/quote] 或者发我邮箱:304310639@qq.com
作者: bravheart037    时间: 2014-7-28 15:05
又有新毛病,大箱子这回是填满了,可是只是真满大箱子,BOT就停止工作了,即使个人物品栏里面空空的,BOT也不工作了。如何让BOT填满大箱子和自己的物品栏才停止工作。
作者: mkonj123    时间: 2014-8-7 23:28
楼主大神求shopbot
作者: bravheart037    时间: 2014-8-8 20:34
[quote=mkonj123,107967]楼主大神求shopbot[/quote] 南瓜BOT里面有。




欢迎光临 战网中国 (http://battlecn.net/) Powered by Discuz! X3.1