[Release] Muddy's D2NT

07/19/2010 20:38 jAmMyX#91
Hehe, wenn er das nicht "anfragt", dann tue ich das :P Aber hab dir dazu ja schon mal ne PM geschickt :) Ein Skript für Travi ohne Tele wäre klasse, am besten eigneltich so:

- Eldritch und vllt noch Schenk (damit das Game lang genug geht ^^)
- Travi

und sobald Gold voll ist -> weggambeln und dann wieder neu loslegen :)
07/19/2010 21:09 andreas4#92
Hallo Muddy,

ich hätte noch eine Anregung zu deinem CS-Skript:
Wäre es vielleicht möglich, auf dem Weg zum de-Seis-Siegel noch einen Zwischenstop einzubauen, um die bei de Seis (dS) befindlichen Monster zu killen?

Ich hatte nämlich gerade folgende Situation beobachtet:
Blitz-Sorc und blitzimmuner dS. Die Sorc öffnet das Siegel und teleportiert sich Richtung dS, so dass sie eine ganze Monsterherde im Rücken hat. Die hält den Söldner im hinteren Bereich des Weges fest, so dass seine Aura nicht bis zu dS reicht. Die Sorc castet also fleissig auf dS, ohne Schaden zu machen. Dabei bekommt sie von der hinter ihrem Rücken stehenden Herde eins auf die Mütze bis der Merc alle einzeln erledigt hat. Oder bis die Herde den Merc oder die Sorc erledigt hat ;)

Keine Ahnung, wie das bei anderen Chars ist, aber für eine Blitz-Sorc wäre es evtl. sinnvoll, auf dem Hinweg noch schnell die dort befindlichen Monster wegzuputzen.

Gruss,
Andreas

Edit: Ähnliche Situation: Wenn sie das Siegel verpasst hat, teleportiert sie sich an dieselbe Stelle und wartet bis der Merc alle umgenietet hat. Dann kommt der nächste Versuch, das Siegel zu öffnen.
07/19/2010 22:27 Muddy Waters#93
Quote:
Originally Posted by jAmMyX View Post
Hehe, wenn er das nicht "anfragt", dann tue ich das :P Aber hab dir dazu ja schon mal ne PM geschickt :) Ein Skript für Travi ohne Tele wäre klasse, am besten eigneltich so:

- Eldritch und vllt noch Schenk (damit das Game lang genug geht ^^)
- Travi

und sobald Gold voll ist -> weggambeln und dann wieder neu loslegen :)
Joa, da war was... :rolleyes:
Tut mir Leid, dass ich mich immernoch nicht drum gekümmert habe, hoffe ich habe demnächst mal wieder Zeit und Lust. :)
Quote:
Originally Posted by andreas4 View Post
Hallo Muddy,

ich hätte noch eine Anregung zu deinem CS-Skript:
Wäre es vielleicht möglich, auf dem Weg zum de-Seis-Siegel noch einen Zwischenstop einzubauen, um die bei de Seis (dS) befindlichen Monster zu killen?

Ich hatte nämlich gerade folgende Situation beobachtet:
Blitz-Sorc und blitzimmuner dS. Die Sorc öffnet das Siegel und teleportiert sich Richtung dS, so dass sie eine ganze Monsterherde im Rücken hat. Die hält den Söldner im hinteren Bereich des Weges fest, so dass seine Aura nicht bis zu dS reicht. Die Sorc castet also fleissig auf dS, ohne Schaden zu machen. Dabei bekommt sie von der hinter ihrem Rücken stehenden Herde eins auf die Mütze bis der Merc alle einzeln erledigt hat. Oder bis die Herde den Merc oder die Sorc erledigt hat ;)

Keine Ahnung, wie das bei anderen Chars ist, aber für eine Blitz-Sorc wäre es evtl. sinnvoll, auf dem Hinweg noch schnell die dort befindlichen Monster wegzuputzen.

Gruss,
Andreas

Edit: Ähnliche Situation: Wenn sie das Siegel verpasst hat, teleportiert sie sich an dieselbe Stelle und wartet bis der Merc alle umgenietet hat. Dann kommt der nächste Versuch, das Siegel zu öffnen.
Also momentan ist das standard D2NT Script enthalten. Ich werde das in zukünftigen Versionen so halten, dass ich stark modifizierte Teile oder Teile die komplett von mir sind auch entsprechend benenne. Das macht das ganze leichter überschaubarer für andere.

Aber zurück zur Frage:
Das standard Diablo Script ist mir ein Dorn im Auge. Ich persönlich mag es, das komplette CS zu säubern, was ja auch im Bezug auf das area level durchaus Sinn macht.
Dazu ist das standard Script völlig ungeeignet, weil der dadurch abgedeckte Bereich viel zu unsauber ist. Mal abgesehen davon, dass die Fehlerabfragen viel zu simpel gehalten sind, sodass das Script gerne schon abbricht, falls mal irgendjemand auf die Idee kommt ein Siegel zu öffnen oder ähnliches.

Der zweite Punkt wird ohnehin anders, wenn ich das Script von der Pike auf neu schreibe.
Für den ersten Punk habe ich auch schon einen Ansatz:
Ich werde das CS in sinnvolle Sektoren unterteilen (also Rechtecke) und dann eine eigene Attack Funktion schreiben, die Monster in einem vorgegebenen Sektor erledigt. Man ist dabei etwas beschränkt, weil man Monster Objekte nur in einem gewissen Radius instantiieren kann (<= ~75), sollte aber trotzdem klappen, wenn nur man die Sektoren entsprechend wählt.
Bei De Seis kann man auch relativ viel machen. Ein erster Schritt ist, dass man die Position des Chars nach Öffnen des Siegels relativ zur Position von De Seis festlegt.

Mal schauen, so genau habe ich noch nicht drüber nachgedacht, aber an sich sollte das alles sehr leicht umsetzbar sein, stellt sich eigentlich nur die Frage, wann ich mal wieder Zeit und Lust habe, um das ganze zu Programmieren. :)

Lg
Muddy
07/20/2010 19:57 andreas4#94
Ok, solange du an dem neuen Skript bastelst ;-), habe ich als Übergangslösung zwei weitere Angriffspositionen eingebaut:

var _attackpos = [7780, 5255, 7800, 5255, 7800, 5235, 7780, 5235, 7769, 5202, 7771, 5164];
07/22/2010 11:16 Snow-Junkee#95
jau läuft ja super :)

habe nur eine frgae meine soso packt nilla nicht so gut wegen den schlangen...
aber mein rotes portal für pindel ist nicht mehr offen...
kann man pindel nicht auch über den wp machen und nilla dabei auslassen?
07/22/2010 12:49 fuuch#96
musst wohl das nila script nehmen und die pindle extension daraus zum mainscript umschreiben
07/22/2010 13:05 Snow-Junkee#97
Quote:
Originally Posted by fuuch View Post
musst wohl das nila script nehmen und die pindle extension daraus zum mainscript umschreiben
habe das jetzt so:

[I]var _NTNihlathak_Locations = new Array(8, 4);

_NTNihlathak_Locations[0] = [12519, 5203, 12522, 5227]; // Top Left
_NTNihlathak_Locations[1] = [12704, 5019, 12692, 5022]; // Top Right
_NTNihlathak_Locations[2] = [12705, 5391, 12723, 5413]; // Bottom Right
_NTNihlathak_Locations[3] = [12889, 5206, 12898, 5228]; // Bottom Left
_NTNihlathak_Locations[4] = [12519, 5203, 12522, 5196]; // Top Left
_NTNihlathak_Locations[5] = [12704, 5019, 12692, 5413]; // Top Right
_NTNihlathak_Locations[6] = [12705, 5391, 12727, 5022]; // Bottom Right
_NTNihlathak_Locations[7] = [12889, 5206, 12898, 5192]; // Bottom Left

function NTMain()
{

if(NTConfig_PindleskinExtension)
{
for(var i = 0 ; i < 2 ; i++)
{

if(!NTM_MoveToStair(me.areaid, 121))
{
NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveToStair()");
return;
}

if(!NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe))
{
NTC_SendMsgToScript("NTBotGame.ntj", "NTTMGR_CheckSafe()");
return;
}

NTP_DoPrecast(false);

if(!NTM_TakeStair(121))
{
NTC_SendMsgToScript("NTBotGame.ntj", "NTM_TakeStair()");
return;
}

if(!NTM_MoveTo(me.areaid, 10061, 13234))
{
NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveTo()");
return;
}

if(!NTA_KillMonster(GetLocaleString(22497)))
{
NTC_SendMsgToScript("NTBotGame.ntj", "NTA_KillMonster()");
return;
}

if(NTConfig_ClearPosition)
NTA_ClearPosition();

NTSI_PickItems();
}

NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_END");
}

// Internal function
function NT_FindNihlathakInt()
{
var i, x, y;
var _nihlathak;
var _mindist = 999999;
var _currdist;
var _location = -1;

_nihlathak = GetPresetUnits(me.areaid, NTC_UNIT_OBJECT, 462);

if(!_nihlathak || _nihlathak.length < 1)
return _location;

x = _nihlathak[0].roomx*5 + _nihlathak[0].x;
y = _nihlathak[0].roomy*5 + _nihlathak[0].y;

for(i = 0 ; i < 8 ; i++)
{
_currdist = GetDistance(_NTNihlathak_Locations[i][0], _NTNihlathak_Locations[1], x, y);

if(_currdist < _mindist)
{
_mindist = _currdist;
_location = i;
}
}

return _location;
}


da muss aber was falsch sein... bekommt error das er es nicht richtig finden/lesen kann...

könnte mir pls jemand beim umschreiben helfen ;) :)
07/22/2010 15:24 Muddy Waters#98
Quote:
Originally Posted by Snow-Junkee View Post
jau läuft ja super :)

habe nur eine frgae meine soso packt nilla nicht so gut wegen den schlangen...
aber mein rotes portal für pindel ist nicht mehr offen...
kann man pindel nicht auch über den wp machen und nilla dabei auslassen?
Wenn es nur an den Vipern liegt, könnte man es so umbasteln, dass das Script übersprungen wird, wenn Vipern vorhanden sind und du ansonsten immer Nihla und Pindle machst.

Ansonsten könnte man es aber auch in ein Extra Script basteln.

Beide Varianten sind schnell und einfach umzusetzen, such dir aus was es werden soll. ;)

Lg
Muddy
07/22/2010 15:50 Snow-Junkee#99
Quote:
Originally Posted by Muddy_Waters View Post
Wenn es nur an den Vipern liegt, könnte man es so umbasteln, dass das Script übersprungen wird, wenn Vipern vorhanden sind und du ansonsten immer Nihla und Pindle machst.

Ansonsten könnte man es aber auch in ein Extra Script basteln.

Beide Varianten sind schnell und einfach umzusetzen, such dir aus was es werden soll. ;)

Lg
Muddy
hmm

also muddy^^

dann hätte ich gern ein script welches die schlangen überspringt und wenn keine da sind trotzdem nilla macht ;)

oder halt das andere, je nach dem welches einfacher ist ;)
07/22/2010 16:18 Muddy Waters#100
Quote:
Originally Posted by Snow-Junkee View Post
hmm

also muddy^^

dann hätte ich gern ein script welches die schlangen überspringt und wenn keine da sind trotzdem nilla macht ;)

oder halt das andere, je nach dem welches einfacher ist ;)
Dauerte keine 2 Minuten, Sachen editieren ist eben doch um einiges einfacher als neue Sachen zu schreiben. :)

Voila:
Code:
var _NTNihlathak_Locations = new Array(8, 4);

_NTNihlathak_Locations[0] = [12519, 5203, 12522, 5227]; // Top Left
_NTNihlathak_Locations[1] = [12704, 5019, 12692, 5022]; // Top Right
_NTNihlathak_Locations[2] = [12705, 5391, 12723, 5413]; // Bottom Right
_NTNihlathak_Locations[3] = [12889, 5206, 12898, 5228]; // Bottom Left
_NTNihlathak_Locations[4] = [12519, 5203, 12522, 5196]; // Top Left
_NTNihlathak_Locations[5] = [12704, 5019, 12692, 5413]; // Top Right
_NTNihlathak_Locations[6] = [12705, 5391, 12727, 5022]; // Bottom Right
_NTNihlathak_Locations[7] = [12889, 5206, 12898, 5192]; // Bottom Left

function NTMain()
{
    Include("libs/common/NTCommon.ntl");
    NTC_IncludeLibs();
    NTC_IncludeConfig("NTBot/char_configs");

    var _location, _viper;

    NT_LoadConfig();
    NTSI_LoadNIPFiles("NTBot/item_configs");

    NTA_Initialize();

    if(!NTTM_CheckAct())
    {
        NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_CheckAct()");
        return;
    }

    NTTMGR_TownManager();

    if(!NTTM_TownMove("waypoint"))
    {
        NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_TownMove()");
        return;
    }

    if(!NTM_TakeWaypoint(123))
    {
        NTC_SendMsgToScript("NTBotGame.ntj", "NTM_TakeWaypoint()");
        return;
    }

    NTP_DoPrecast(true);

    if(!NTM_MoveToStair(me.areaid, 124))
    {
        NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveToStair()");
        return;
    }

    if(!NTM_TakeStair(124))
    {
        NTC_SendMsgToScript("NTBotGame.ntj", "NTM_TakeStair()");
        return;
    }
        
    _viper = NTC_FindUnit(NTC_UNIT_MONSTER, 597);
    
    if(!_viper)
    {
        _location = NT_FindNihlathakInt();

        if(_location == -1)
        {
            NTC_SendMsgToScript("NTBotGame.ntj", "NT_FindNihlathakInt()");
            return;
        }

        if(!NTM_MoveTo(me.areaid, _NTNihlathak_Locations[_location][2], _NTNihlathak_Locations[_location][3]))
        {
            NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveTo()");
            return;
        }

        if(!NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe))
        {
            NTC_SendMsgToScript("NTBotGame.ntj", "NTTMGR_CheckSafe()");
            return;
        }

        if(NTA_KillMonster(526))
        {
            if(NTConfig_ClearPosition)
                NTA_ClearPosition();
        
            NTSI_PickItems();
        }
        else if(!NTConfig_PindleskinExtension)
        {
            NTC_SendMsgToScript("NTBotGame.ntj", "NTA_KillMonster()");
            return;
        }
    }
    else
        Print("ÿc1Tomb Vipers detected - Skipping Nihlatak");
    
    if(NTConfig_PindleskinExtension)
    {
        for(var i = 0 ; i < 2 ; i++)
        {
            if(!NTM_MoveToStair(me.areaid, 123-i))
            {
                NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveToStair()");
                return;
            }

            if(!NTM_TakeStair(123-i))
            {
                NTC_SendMsgToScript("NTBotGame.ntj", "NTM_TakeStair()");
                return;
            }
        }

        if(!NTM_MoveToStair(me.areaid, 121))
        {
            NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveToStair()");
            return;
        }

        if(!NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe))
        {
            NTC_SendMsgToScript("NTBotGame.ntj", "NTTMGR_CheckSafe()");
            return;
        }

        NTP_DoPrecast(false);

        if(!NTM_TakeStair(121))
        {
            NTC_SendMsgToScript("NTBotGame.ntj", "NTM_TakeStair()");
            return;
        }

        if(!NTM_MoveTo(me.areaid, 10061, 13234))
        {
            NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveTo()");
            return;
        }

        if(!NTA_KillMonster(GetLocaleString(22497)))
        {
            NTC_SendMsgToScript("NTBotGame.ntj", "NTA_KillMonster()");
            return;
        }

        if(NTConfig_ClearPosition)
            NTA_ClearPosition();

        NTSI_PickItems();
    }

    NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_END");
}

// Internal function
function NT_FindNihlathakInt()
{
    var i, x, y;
    var _nihlathak;
    var _mindist = 999999;
    var _currdist;
    var _location = -1;

    _nihlathak = GetPresetUnits(me.areaid, NTC_UNIT_OBJECT, 462);

    if(!_nihlathak || _nihlathak.length < 1)
        return _location;

    x = _nihlathak[0].roomx*5 + _nihlathak[0].x;
    y = _nihlathak[0].roomy*5 + _nihlathak[0].y;

    for(i = 0 ; i < 8 ; i++)
    {
        _currdist = GetDistance(_NTNihlathak_Locations[i][0], _NTNihlathak_Locations[i][1], x, y);

        if(_currdist < _mindist)
        {
            _mindist = _currdist;
            _location = i;
        }
    }

    return _location;
}
Ich werde es dann im nächsten Release mit Config Parameter einbinden - sofern ich das Release denn irgendwann mal fertig haben sollte. :)

Lg
Muddy
07/23/2010 11:30 snow21#101
hi ihr

ich habe mal eine frage wegen zu der max-stash-item-anzahl

Quote:
//[Name] == Diamond
//[Name] == Emerald
//[MaxAmount] == 3 && [Name] == Ruby
//[Name] == Skull
//[Name] == Sapphire
//[Name] == Topaz
seh ich das richtig, wenn ich als bsp maximal 3 topase im inventar haben möchte das ich das dann so abänder?

Quote:
//[Name] == Diamond
//[Name] == Emerald
//[MaxAmount] == 3 && [Name] == Ruby
//[Name] == Skull
//[Name] == Sapphire
[MaxAmount] == 3 && [Name] == Topaz
oder wenn ich cubing auf true habe macht er das dann automatisch mit den items, dass er den max wert setzt oder ist das ein absoluter wert der immer genommen wird auch wenn ich cuben nicht auf true habe?


dann sag ich schon mal vielen dank für die hilfe.
07/23/2010 12:39 Muddy Waters#102
Quote:
Originally Posted by snow21 View Post
hi ihr

ich habe mal eine frage wegen zu der max-stash-item-anzahl



seh ich das richtig, wenn ich als bsp maximal 3 topase im inventar haben möchte das ich das dann so abänder?



oder wenn ich cubing auf true habe macht er das dann automatisch mit den items, dass er den max wert setzt oder ist das ein absoluter wert der immer genommen wird auch wenn ich cuben nicht auf true habe?


dann sag ich schon mal vielen dank für die hilfe.
Benutz doch eine [code]-Box statt Zitaten, die kann man wenigstens vernünftig zitieren. ;)

Ich musste eben selber mal nachschauen, ist schon ein paar Tage her, dass ich das geschrieben habe.
An sich legst du damit die maximale Anzahl an Items dieses Typs auf deinem Char fest, wobei Cubing wie sonst auch außen vor steht.
Wenn du sagst, die maximale Anzahl soll 3 betragen, dann werden solange Items dieses Typs aufgehoben, bis dein Char davon 3 Stück in Inventar oder Stash hat.

Grundgedanke bei der Funktion waren übrigens tatsächlich Gems und Runen. Ich hatte nämlich häufig das Problem, dass mir mal ein paar lowies für ein Runenwort fehlten, ich aber nicht direkt die ganze Kiste davon voll haben wollte.
Dafür ist es gedacht und dafür sollte es auch funktionieren. Bei anderen Items können schnell mal Mehrdeutigkeiten entstehen.
Wenn ich z.B. sowas schreibe:
Code:
[Maxamount] == 2 && [Name] == Ring && [Quality] == magic # [ItemMagicBonus] >= 30
[Name] == Ring && [Quality] == magic # [ItemMagicBonus] >= 25
...hätte meine Maximalmenge gar keine Relevanz. Anders als bei Items die gestasht werden (hier werden die .nip Files nicht weiter durchsucht, wenn eine Übereinstimmung gefunden wurde) werden bei einer Mengenüberschreitung trotzdem weiter die .nip Files durchsucht.

Eine Maximalmenge macht also nur Sinn bei eindeutigen und einzigartigen Einträgen. ;)
Ich hoffe das reicht an Hintergrundwissen, ansonsten nochmal nachfragen, ich kann auch gerne noch weiter ins Detail gehen. :)

Lg
Muddy
07/23/2010 17:56 Deutsche-Mafia#103
könntest du mal sowas wie einen spiritbot einbauen?^^
07/23/2010 18:15 Muddy Waters#104
Quote:
Originally Posted by Deutsche-Mafia View Post
wann kommt der spiritbot?^^
Vermutlich nie, jedenfalls nicht von mir. Ich brauche sowas nicht und es reizt mich auch nicht unbedingt, das dennoch zu programmieren.

Schreibs dir selbst! :p

Lg
Muddy
07/23/2010 22:18 trancemonkey#105
hi!
Bin vor 2 Tagen auf deinen Mod gestoßen und finde ihn echt sehr gelungen!! Bin sofort umgestiegen. vielen dank

Bin seit einiger zeit auf der suche nach einem "slow"-diablo script. Hab schon versucht selber was zu machen aber bei meinen Programmierkenntnissen wird das nix.
Hatte mir was vorgestellt wo der Bot zuerst die 3 "Arme" im CS cleart und dann das jeweilige Siegel öffnet.
Könnte es vielleicht selber machen indem ich bei "var _attackpos" vor dem Siegelöffnen noch die jeweiligen Positionen hinzufüge. Bin aber verwirrt wie das geht, da sich der Aufbau der Map ja immer etwas ändert.
wäre froh über ein wenig hilfe ;)
Lg jan