Verbessertes Stashen

10/03/2010 22:54 ldevil#1
Viele wird's wohl nicht interessieren, aber mir geht der Algorithmus der zum Stashen verwendet wird auf den Kecks. Denn so bleibt bei mir am Ende oft die untersten Reihen frei und ich hab was "grossen" im Inventar wodurch ich viel öfters in die Stadt identen muss.

Hab daher die Variante vom mmBot implementiert, der die Kiste in 3 Zweierreihen unterteilt und alles nur in diese packt (sprich nicht dazwischen) und bei der ganz links oben beginnt, dann die mittlere und erst am ende die rechte vollpackt.

Waren nur paar kleine Änderungen in der NTTown.ntl

Code:
function NTT_ManageStash(invitem)
{
    var i, x, y[COLOR="Red"], z[/COLOR];
    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++)
            _stashspace[y][x] = 0;
    }

    _items = me.GetItems();

    if(!_items)
        return false;

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

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

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

            if(!_ignoreitem)
            {
                _itemdone = false;
[COLOR="Red"]                for(z = 0 ; z < 3; z++)
                {[/COLOR]
                    for(y = 0 ; y < StashHeight ; y++)
                    {
                        if(_itemdone)
                            break;    
    
                        for(x = 0 ; x < [COLOR="Red"](3 - _items[i].xsize)[/COLOR] ; x++)
                        {
[COLOR="Red"]                            var xx = 2*z + x;[/COLOR]
                            if(_itemdone)
                                break;

                            if(_stashspace[y][[COLOR="Red"]xx[/COLOR]] == 0)
                            {
                                if(([COLOR="Red"]xx[/COLOR]+_items[i].xsize-1) < 6 && (y+_items[i].ysize-1) < StashHeight)
                                {
                                    var _havespace = true;

                                    for(m = 0 ; m < _items[i].ysize ; m++)
                                    {
                                        for(n = 0 ; n < _items[i].xsize ; n++)
                                        {
                                            if(_stashspace[y+m][[COLOR="Red"]xx[/COLOR]+n] == 1)
                                            {
                                                _havespace = false;
                                                m = 4;
                                                break;
                                            }
                                        }
                                    }

                                    if(_havespace)
                                    {
                                        if(NTC_ItemToCursor(_items[i]))
                                        {
                                            for(n = 0 ; n < 80 ; n++)
                                            {
                                                if((n % 40) == 0)
                                                    me.ClickItem(0, [COLOR="Red"]xx[/COLOR], y, 4);

                                                NTC_Delay(100);

                                                if(!me.itemoncursor)
                                                    break;
                                            }

                                            if(n < 80)
                                            {
                                                for(m = 0 ; m < _items[i].ysize ; m++)
                                                {
                                                    for(n = 0 ; n < _items[i].xsize ; n++)
                                                        _stashspace[y+m][[COLOR="Red"]xx[/COLOR]+n] = 1;
                                                }
                                            }

                                            NTC_PingDelay(200);
                                        }

                                        _itemdone = true;
                                    }
                                }
                            }
                        }
                    }
                [COLOR="Red"]}[/COLOR]
            }

            if(!_stashall)
                return true;
        }
    }

    return true;
}
Hab die Änderungen rot markiert, war wirklich nicht viel.
10/18/2010 18:58 stairbuilder#2
always hated the way d2nt managed stash and thought turbot and mmbot did a much better job, but never got around to looking into changing it

nice work!!!
10/20/2010 15:43 W33DB0X#3
oh mann das such ich genau das

*U MADE MY DAY PERFEKT*

nur noch hinbekommen :/
10/20/2010 19:58 ldevil#4
Quote:
Originally Posted by W33DB0X View Post
oh mann das such ich genau das

*U MADE MY DAY PERFEKT*

nur noch hinbekommen :/
Ach komm, so kompliziert ist das nicht. Aber freut mich, dass es einige brauchen :)
10/20/2010 23:41 W33DB0X#5
Quote:
Originally Posted by ldevil View Post
Ach komm, so kompliziert ist das nicht. Aber freut mich, dass es einige brauchen :)

wenn mann 5 tage erst mi d2nt arbeitet und auf HC bottet kann alles kleine große wirkung haben ! XD

;)

@ MoM

Soso 1 = 78
Soso 2 = 73
10/21/2010 00:10 ldevil#6
Quote:
Originally Posted by W33DB0X View Post
wenn mann 5 tage erst mi d2nt arbeitet und auf HC bottet kann alles kleine große wirkung haben ! XD

;)
Zum Glück stashed er normalerweise in der Stadt :p Oder man testet es mit nem SC Char.

Aber ich wünsch deinem Char ein langes Leben :D
12/26/2010 20:35 mirkoregge#7
schick schick, Thanks :)
12/26/2010 20:56 GruenerApfel#8
super genau das was ich gesucht hab, thx :=)
12/27/2010 14:32 Muddy Waters#9
Schick, irgendwann wollte ich mir das auch mal anschauen, bin dann aber wie so oft drüber weg gekommen. :rolleyes:

Ich werde mir das mal abgucken, wenn es genehm ist. ;)

Lg
Muddy
12/27/2010 18:27 ldevil#10
Quote:
Originally Posted by Muddy_Waters View Post
Schick, irgendwann wollte ich mir das auch mal anschauen, bin dann aber wie so oft drüber weg gekommen. :rolleyes:

Ich werde mir das mal abgucken, wenn es genehm ist. ;)

Lg
Muddy
Solange du nicht vor hast es zu verkaufen :p
12/29/2010 00:26 Muddy Waters#11
Ich habe das ganze mal mit ein paar Copy&Paste Handgriffen erweitert, sodass nun Items, die zum Cuben aufgehoben werden, von unten rechts an einsortiert werden.

Grundgedanke war, dass man damit der Entstehung von "Löchern", die durch eingepackte und später vercubte gems und Runen entstehen, durch eine räumliche Trennung etwas vorbeugt. So entstehen die "Löcher" dann dort, wo ohnehin immer gems und Runen nachgelegt werden.

Ob das den gewünschten Effekt auch tatsächlich erzielen kann oder ob es ziemlicher Unsinn ist, weiss ich noch nicht, aber rein vom Ablauf her scheint das schon ganz gut zu funktionieren.

Falls es jemand testen möchte:
Code:
function NTT_ManageStash(invitem)
{
    var i, x, y, z, xx;
    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++)
            _stashspace[y][x] = 0;
    }

    _items = me.GetItems();

    if(!_items)
        return false;

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

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

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

            if(!_ignoreitem)
            {
                _itemdone = false;
               
                if(NTSI_CheckItem(_items[i]) == 1)
                {
                    for(z = 0; z < 3; z++)
                    {
                        for(y = 0; y < StashHeight; y++)
                        {
                            if(_itemdone)
                                break;    
        
                            for(x = 0; x < 3 - _items[i].xsize; x++)
                            {
                                xx = 2*z + x;
                                
                                if(_itemdone)
                                    break;

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

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

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

                                                    NTC_Delay(100);

                                                    if(!me.itemoncursor)
                                                        break;
                                                }

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

                                                NTC_PingDelay(200);
                                            }

                                            _itemdone = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    for(z = 2; z >= 0; z--)
                    {
                        for(y = StashHeight - 1; y >= 0; y--)
                        {
                            if(_itemdone)
                                break;    
                            
                            for(x = 2 - _items[i].xsize; x >= 0; x--)
                            {
                                xx = 2*z + x;
                                
                                if(_itemdone)
                                    break;

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

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

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

                                                    NTC_Delay(100);

                                                    if(!me.itemoncursor)
                                                        break;
                                                }

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

                                                NTC_PingDelay(200);
                                            }

                                            _itemdone = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if(!_stashall)
                return true;
        }
    }

    return true;
}
Lg
Muddy
12/29/2010 15:02 Kobold2#12
hallo,
ich habe einfach mal dein code von oben getest.
also ich bekomme folgende fehlermeldung, wenn er von einem vollen mule char auf den nächsten wechseln will.
[Only registered and activated users can see links. Click Here To Register...]

gruss
12/29/2010 15:11 Muddy Waters#13
Quote:
Originally Posted by Kobold2 View Post
hallo,
ich habe einfach mal dein code von oben getest.
also ich bekomme folgende fehlermeldung, wenn er von einem vollen mule char auf den nächsten wechseln will.
[Only registered and activated users can see links. Click Here To Register...]

gruss
Wäre interessant zu wissen, welche Funktion bei dir in Zeile 1794 steht.

Obige Sortierfunktion bricht nämlich ab, wenn der Objektzeiger dem Nullzeiger entspricht. Und zwar bevor damit weitergearbeitet wird, darum kann die Funktion diesen Fehler der Theorie nach gar nicht verursachen.

Ich würde vermuten die Fehlermeldung bezieht sich auch eine andere Funktion oder du hast schlicht Teile der Funktion vergessen.

Um mehr zu sagen, bräuchte man mehr Input. ;)

Lg
Muddy
12/29/2010 15:12 ldevil#14
Hm, nur damit ich das richtig verstehe - weil ich müsste bei mir dann auch noch nen anderen Algo entsprechend anpassen - wie räumt er die Stash nun genau ein?

Alles was er "normal" aufhebt von links oben jeweils in den 2er Reihen und alles was er zum Cuben braucht wie eth Armros, Runen, Gems und so von rechts unten eben falls in den 2er Reihen? Oder macht er was anders? Ob's wirklich ne Rolle spielt ist dann natürlich die Frage dich ich mir noch stellen muss, wobei das mit AutoMule eh nicht soo relevant ist ;)

Aber klint interessant, muss ich mir mal etwas genauer überlegen, wann es was bringen könnte.
12/29/2010 16:58 Kobold2#15
Quote:
Originally Posted by Muddy_Waters View Post
Wäre interessant zu wissen, welche Funktion bei dir in Zeile 1794 steht.

Obige Sortierfunktion bricht nämlich ab, wenn der Objektzeiger dem Nullzeiger entspricht. Und zwar bevor damit weitergearbeitet wird, darum kann die Funktion diesen Fehler der Theorie nach gar nicht verursachen.

Ich würde vermuten die Fehlermeldung bezieht sich auch eine andere Funktion oder du hast schlicht Teile der Funktion vergessen.

Um mehr zu sagen, bräuchte man mehr Input. ;)

Lg
Muddy
Hallo,
erstmal muss ich zugeben, dass ich mich oben etwas falsch ausgedrückt habe, denn die meldung kommt von dem neuen, leeren mule char. also der bot ist voll -> macht nen mule game auf -> der mule char sammelt die sachen auf bis auch er voll ist -> nächster mule char logt sich ein -> fehlermeldung.

also in zeile 1794 steht bei mir:
for(var i = 0 ; i < _items.length ; i++)

ich habe einfach den ihnalt der box bei mir ersetzt. nicht mehr und nicht weniger :D


ps: noch ne kurze andere frage:
ab wann wechselt der bot von einem mule char auf den anderen? also ab wann gilt ein mule char als voll? weil der wechselt auf den anderen mule char, auch wenn beim ersten mule char noch das ganze inventar frei ist.



peace :)