[C++] Target Makros?

Guten Morgen Leute!

Ich suche seit gestern Abend alternative Target Methoden für ein Boss Script.

Ich suche halt sowas wie z.B. (AUSGEDACHT)


SelectTarget(SELECT_TARGET_MAINTANK,0) // Haupttank

SelectTarget(SELECT_TARGET_LOW_AGGRO) // Den mit der geringsten Aggro

SelectTarget(SELECT_TARGET_MANA_CLASS) // Eine Manaklasse

Doch leider finde ich immer nur


if( Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))

{

     DoCast(pTarget, SPELL_MIND_FLAY);

}


oder


if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))

     lich->AI()->AttackStart(target);

Wäre super wenn mir jemand erklären könnte welche Makros “SELECT_TARGET_XXX” es noch gibt /emoticons/default_smile.png

Liebe Grüße

Yellow

Schau dir bei sowas die Definition der Funktion an, die du aufrufst. In dem Fall würde dir auffallen, dass die 0, welche du übergibst, dem Rang in der Threatliste entspricht. 0 ist die Unit, mit dem meisten Hass. Um die Unit mit dem niedrigsten Hass heraus zu bekommen, müsstest du vorher die Hassliste abfragen, schaun wie viele dort drin sind und dann die Anzahl -1 übergeben, weil Array mit 0 beginnt. Durch den boolschen Wert am Ende, übergibst du, ob die Unit ein Spieler sein muss. True steht dafür, dass nur Spieler als target in Frage kommt. False für alle Units, also auch Pets, Totems und dergleichen.

ah ok also wäre in einer 5er Gruppe der Healer högst warscheinlich dann die 5-1=4.

Danke schön Micha!

An sich ja. Allerdings musst du da vorsichtig sein mit festen Werten, da es ja sein könnte, dass nicht mehr alle am Leben sind, wodurch ein TargetSelector mit 4 in einer 5 Gruppe unter Umständen eben kein Ziel zurück gibt, da das Tod ist, oder noch keinen Hass auf dem Mob hat oder oder oder.

oh stimmt… hast du einen Lösungsvorschlag für mich? Ist mein erstes Script in dem ich diese Funktion nutze. Im Moment habe ich geschrieben

SelectTarget(SELECT_TARGET_RANDOM, rand()%5-1);

Da besteht noch ein Missverständnis. Wie gesagt, wirst du die Funktion besser verstehen, wenn du sie dir einfach mal anschaust. Bist ja nicht auf den Kopf gefallen.

Ansonsten, der übergebene Parameter, ist quasi nen Minimumwert. Sprich, wenn du zum Beispiel 1 eingibst, dann heißt das nicht, dass es immer der zweite in der Hassliste ist, sondern höchstens der zweite in der Hassliste. Sprich, man würde 1 übergeben, wenn man wollte, dass jeder außer der Tank, betroffen sein kann.

Um den niedrigsten in der Liste zu bekommen, würde ich es in etwa so machen:


int number_of_targets = 0;

Map::PlayerList const &players = instance->GetPlayers();

if (!players.isEmpty())

	if (Player* player = players.begin()->getSource())

    	if (player->isAlive() && player->isInThreadList()) // keine Ahnung, ob die Funktion so heißt, aber sowas in der Art müsste es geben

        	++number_of_targets;


if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, number_of_targets, 100.0f, true))

{

	// do something with target

}

Damit solltest du in jedem Fall den letzten Spieler in der Hassliste als Target bekommen.

Super danke Micha. Ich werde mir mal die Funktion genauer anschauen.

Wobei ich sagen muß das ich noch nicht mit Klasse Map gearbeitet habe. Werde mir diese wohl auch genauer anschauen müssen /emoticons/default_biggrin.png

Aber erstmal herzlichen dank…

PS: Schade das es keine Ref zu den Classen und Funktionen gibt. So wie im Wiki bei der DB und DBC’s /emoticons/default_wink.png