Quote:
Originally Posted by fuuch
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