mob killreihenfolge festlegen

07/31/2010 05:54 Muddy Waters#16
Quote:
Originally Posted by fuuch View Post
danke das du dir die zeit nimmst, dich damit zu befassen muddy
Da nicht für. :)

Ich finde es eigentlich schade, dass es nicht mehr solche topics in der Programming Sektion gibt. Das meiste sind immer nur grobe Anfragen á la "ich möchte ein Script, welches dies und das macht, wie mache ich das?", wobei dann nach Möglichkeit schon direkt das fertige Script erwartet wird.

Sowas hier ist da etwas anders, weil du dir selber Gedanken machst, eigene Ansätze schreibst und dann wirklich etwas zur Programmierung selbst fragst.
Ich jedenfalls werde bei sowas immer gerne antworten, sofern es mein Wissen zulässt. :)

Lg
Muddy
07/31/2010 10:43 fuuch#17
irgendwo ist noch eine endlosloop drin, glaube ich.
bot portet zu baal runter und direkt nachdem er den thronsaal betritt fängt das spiel an immer stärker zu ruckeln bis eine exception kommt und das game crasht.
08/02/2010 16:19 Muddy Waters#18
Quote:
Originally Posted by fuuch View Post
irgendwo ist noch eine endlosloop drin, glaube ich.
bot portet zu baal runter und direkt nachdem er den thronsaal betritt fängt das spiel an immer stärker zu ruckeln bis eine exception kommt und das game crasht.
Ich hatte da in der Tat etwas gepfuscht, das kommt davon, wenn man nicht in Ruhe arbeitet und zudem noch viel kopiert. :o

Einige kleinere Fehler, sowie die völlig falsche Verwendung der Zählvariablen i zum Durchlaufen des Arrays, obwohl dieser Bezeichner in diesem Geltungsbereich schon für die äußere (spectype) Zählschleife vergeben war. :rolleyes:
Letzteres verursachte, wie du schon richtig vermutet hattest, eine Endlosschleife...

Versuch mal die aufgeräumte Variante:
Code:
function NTA_ClearPosition(range, pickitem, safelevel)
{
    var _orgx, _orgy;
    var _spectype = [0x0A, 0x01, 0x01];
    var _skiplist;
    var _attackcount = 0;
    var _target;
    var _distance, _mingid, _mindistance;
    var _result;
    var _monsters, _newMonster;
    var  _mingidRes, _mindistRes, _tempTarget;
    var _ignoreSpectype = false;
        
    if(NTConfig_AttackSkill[1] < 1 || NTConfig_AttackSkill[3] < 1)
        return false;

    switch(arguments.length)
    {
    case 0:
        range = 20;
    case 1:
        pickitem = false;
    case 2:
        safelevel = 0;
    default:
        if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
            safelevel = 0;
        break;
    }

    _orgx = me.x;
    _orgy = me.y;

    for(var i = 0 ; i < _spectype.length ; i++)
    {
        _skiplist = new Array();

        while(_attackcount < (i+1)*100)
        {
            _mindistance = 1E5;

            _target = NTC_FindUnit(NTC_UNIT_MONSTER);
            
            _monsters = new Array();

            if(_target)
            {
                do
                {
                    if(_skiplist.indexOf(_target.gid) < 0)
                    {
                        if(_target.IsAttackable() && ((_ignoreSpectype)?true:(_target.spectype&_spectype[i])))
                        {
                            if(GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTA_IsValidMonster(_target))
                            {
                                _distance = GetDistance(me, _target);

                                if(_distance < _mindistance)
                                {
                                    _mingid = _target.gid;
                                    _mindistance = _distance;
                                }
                                
                                _newMonster = new MonsterData(_mingid, NTA_GetResistance(_target, NTA_DAMAGE_FIRE), NTA_GetResistance(_target, NTA_DAMAGE_COLD), NTA_GetResistance(_target, NTA_DAMAGE_LIGHTNING), NTA_GetResistance(_target, NTA_DAMAGE_POISON), NTA_GetResistance(_target, NTA_DAMAGE_PHYSICAL), NTA_GetResistance(_target, NTA_DAMAGE_MAGIC));
                                
                                if(_newMonster)
                                    _monsters.push(_newMonster);
                            }
                        }
                        else
                            _skiplist.push(_target.gid);
                    }
                } while(_target.GetNext());
            }
            
            _monsters.sort(MW_SortByResistance);
            
            _mingidRes = 0;
            _mindistRes = 1E6;
            _tempTarget;
           
            for(var k = 0; k < _monsters.length; k++)
            {
                  _tempTarget = NTC_FindUnit(NTC_UNIT_MONSTER, _monsters[k].gid);
                
                if(_tempTarget)
                {
                    if(k > 0 && _monsters[k].res.phys != _monsters[k-1].res.phys)
                        break;
                    
                    /* Alternativ: Nicht niedrigste Resistenz prüfen, sondern nächstes Monster angreifen, das nicht immun ist
                    if(i > 0 && _monsters[k].res.phys > 99)
                        break;
                    */
                    
                    _distance = GetDistance(me, _tempTarget);
                    
                    if(_distance < _mindistRes)
                    {
                        _mingidRes = _tempTarget.gid;
                        _mindistRes = _distance;
                    }
                }
            }
           
            if(_mindistance < 1E5)
            {
                if(_monsters.length > 0)
                    _target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingidRes);
                
                if(!_target)
                    _target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
                                
                if(_target)
                {
                    _result = NTA_Attack(_target, (_attackcount%30) == 0);

                    switch(_result)
                    {
                    case 1:
                        _skiplist.push(_mingid);
                        break;
                    case 2:
                    case 3:
                        if(NTConfig_PickItemsInstantly && (_target.hp <= 0 || _target.mode == 0 || _target.mode == 12))
                            NTSI_PickItems();
                        _attackcount++;
                        break;
                    default:
                        return false;
                    }
                }
            }
            else
                break;
        }
    }

    if(me.classid == NTC_CHAR_CLASS_PALADIN)
    {
        if(_attackcount > 2 && (parseInt(me.hp*100/me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp*100/me.mpmax) < NTConfig_UseRedemptionMP))
        {
            if(NTC_PutSkill(124, NTC_HAND_RIGHT))
                NTC_PingDelay(2000);
        }
    }
           
    if(NTConfig_OpenChest)
    {
        _target = NTC_GetSpecialChest();

        if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTC_OpenChest(_target))
            _attackcount++;
    }
    
    if(pickitem && _attackcount > 0)
        NTSI_PickItems();
        
    switch(safelevel)
    {
    case 1:
        return NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01);
    case 2:
        return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
    }

    return true;
}
Lg
Muddy
08/02/2010 22:20 fuuch#19
syntax stimmt soweit.
mir ist gerade aufgefallen, dass die botscripte die reihenfolge overriden
z.B.
Code:
NT_KillMonster(GetLocaleString(2851) (Vizier im diascript ist das)
wird ausgeführt, ohne das die reihenfolge überhaupt drankommt.
dies hat zur folge, dass der bot den named attackiert - komme was wolle.
08/03/2010 14:56 Muddy Waters#20
Quote:
Originally Posted by fuuch View Post
syntax stimmt soweit.
mir ist gerade aufgefallen, dass die botscripte die reihenfolge overriden
z.B.
Code:
NT_KillMonster(GetLocaleString(2851) (Vizier im diascript ist das)
wird ausgeführt, ohne das die reihenfolge überhaupt drankommt.
dies hat zur folge, dass der bot den named attackiert - komme was wolle.
Das sowieso, wobei ich ja auch schon zu obiger Funktion etwas in der Richtung angemerkt hatte:
Quote:
Originally Posted by Muddy_Waters View Post
Achja, es ist offensichtlich, dass der spectype hier ziemlich negativ reinfunkt, weil PI Bosse trotzdem immer zuerst angegriffen werden. ;)
Für die Funktion könnte man es umgehen, indem man den spectype schlicht ignoriert, eine Variable dafür steckt schon in der letzten Version die ich gepostet habe.

Dein anderes Problem könnte man umgehen, indem man vor dem entsprechenden Monster einen Aufruf von NTA_ClearPosition() einfügt.
Eventuell könnte der Aufruf auch direkt innerhalb der Funktion NTA_KillMonster() auftauchen. Dann würde ich allerdings erstmal überprüfen, ob überhaupt andere Monster in der Nähe sind und die Funktion nur aufrufen, wenn dies auch der Fall ist.

Lg
Muddy
08/11/2010 00:09 Diablofarmer#21
zeigs ihnen Muddy :D