Quote:
Originally Posted by -Nemesis1337-
Nja hab diesen Eintrag ja schon gefunden.
D.h. es muss wohl eine Variable geben um den Monstertyp noch mit angeben zu können:
|
Bitte Quellcode nicht als [Quote] posten, dabei geht die gesamte Formatierung übern Jordan und man kann nichts mehr lesen. ;)
Die Funktion zählt lediglich die Monster Units im passenden Bereich und gibt dann die Anzahl zurück. Der Rückgabetyp ist also lediglich ein number Objekt, nicht mehr und nicht weniger.
Wenn du zwischen den verschiedenen Units unterscheiden willst, musst du in die Funktion direkt gehen. So wie ich das gerade sehe, habe ich das relativ kompliziert umgesetzt, aber frag mich jetzt nicht wieso.
Die Funktion dazu sieht so aus:
Code:
function MW_CountMonstersInThrone(range, showMonsters)
{
var _monster, _count, _monsterData, _output;
var i;
if(arguments.length < 1)
range = 100;
if(arguments.length < 2)
showMonsters = false;
_count = 0;
_monsterData = new Array();
_monster = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_monster)
{
do
{
if(NTA_IsValidMonster(_monster) && _monster.IsAttackable() && _monster.y <= 5090 && GetDistance(me, _monster) < range)
{
for(i = 0; i < _monsterData.length; i++)
{
if(_monsterData[i][0] == _monster.classid)
{
if(_monsterData[i][1] == "" && !(_monster.spectype&0x0E))
_monsterData[i][1] = _monster.name;
_monsterData[i][2]++;
break;
}
}
if(i >= _monsterData.length)
{
_monsterData.push([_monster.classid, "", 1]);
if(!(_monster.spectype&0x0E))
_monsterData[_monsterData.length - 1][1] = _monster.name;
}
_count++;
}
}
while(_monster.GetNext());
}
if(showMonsters)
{
Print("ÿc1" + _count + " ÿc8monsters in Throne:");
for(i = 0; i < _monsterData.length; i++)
{
_output = "ÿc8" + _monsterData[i][1];
if(_monsterData[i][1].indexOf("Fury") > -1)
_output = _output.replace("Fury", "Furies");
else if(_monsterData[i][1].indexOf("Witch") > -1 || _monsterData[i][1].indexOf("Magus") > -1)
_output += "es";
else
_output += 's';
_output += ": ÿc1" + _monsterData[i][2];
Print(_output);
}
}
return _count;
}
Die Funktion macht prinzipiell nichts anderes, als die Monster abhängig von ihrem Typ in ein Array einzusortieren.
Was man vielleicht verbessern sollte, ist das Beschaffen der Klassen Namen der Monster - denn das wird hier direkt aus den Units abgeleitet, was in dem Moment in die Hose geht, wenn einmal nur Champions von einer Monstersorte verfügbar sind.
Jedenfalls lässt sich das leicht so erweitern, dass die Ausgabe der verschiedenen Monsterklassen nicht nur auf die Konsole erfolgt, sondern eben auch eine Chat Ausgabe ausgeführt wird.
Sowas könnte dann etwa so aussehen:
Code:
function MW_CountMonstersInThrone(range, showMonsters)
{
var _monster, _count, _monsterData, _output, _chatOutput;
var i;
if(arguments.length < 1)
range = 100;
if(arguments.length < 2)
showMonsters = false;
_count = 0;
_monsterData = new Array();
_monster = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_monster)
{
do
{
if(NTA_IsValidMonster(_monster) && _monster.IsAttackable() && _monster.y <= 5090 && GetDistance(me, _monster) < range)
{
for(i = 0; i < _monsterData.length; i++)
{
if(_monsterData[i][0] == _monster.classid)
{
if(_monsterData[i][1] == "" && !(_monster.spectype&0x0E))
_monsterData[i][1] = _monster.name;
_monsterData[i][2]++;
break;
}
}
if(i >= _monsterData.length)
{
_monsterData.push([_monster.classid, "", 1]);
if(!(_monster.spectype&0x0E))
_monsterData[_monsterData.length - 1][1] = _monster.name;
}
_count++;
}
}
while(_monster.GetNext());
}
if(showMonsters)
{
Print("ÿc1" + _count + " ÿc8monsters in Throne:");
_chatOutput = "Monster types: ";
for(i = 0; i < _monsterData.length; i++)
{
_output = "ÿc8" + _monsterData[i][1];
if(_chatOutput.indexOf('[') > -1)
_chatOutput += ", ";
_chatOutput += _monsterData[i][1] + " [" + _monsterData[i][2] + "]";
if(_monsterData[i][1].indexOf("Fury") > -1)
_output = _output.replace("Fury", "Furies");
else if(_monsterData[i][1].indexOf("Witch") > -1 || _monsterData[i][1].indexOf("Magus") > -1)
_output += "es";
else
_output += 's';
_output += ": ÿc1" + _monsterData[i][2];
Print(_output);
}
Say(_chatOutput);
}
return _count;
}
Aber wie schon erwähnt würde ich, um das besser zu machen, einfach noch eine kleine Funktion schreiben, die den Klassennamen zu einer classid zurückgibt. Wobei das eher zu den Nuancen zählt, sollte auch so schon das machen, was du willst. ;)
LG
Muddy