Dedication - Allianz - Malygos
Würden Sie gerne auf diese Nachricht reagieren? Erstellen Sie einen Account in wenigen Klicks oder loggen Sie sich ein, um fortzufahren.

Addons Makros

3 verfasser

Nach unten

Addons Makros Empty Addons Makros

Beitrag von Badeye So Jul 26, 2009 4:03 pm

ich hab mal im i net geschnüffelt und das gefunden

Sodele hier der erste Versuch einer Makro und Scripting Anleitung "von 0 auf irgendwas". Intention dieses Threads ist es einen Einstiegspunkt zu lierfern, sowie eine kleine Refferenz an "Standart-Befehlen".
Ich gehe nicht auf UI-Modding ein, dazu gibt es andere, wentlich bessere Quellen, außerdem ist eher eine Thema für ein komplettes Forum, als einen einzelnen Thread. Ein weiterer Hauptteil dieses Threads ist LUA-Programmierung. Ich werde alle wichtigen Strukuren der Sprache behandeln und eine kleine Refferenz zu LUA liefern. Natürlich abgespeckt auf das was man für WoW braucht. Die meisten Beispiele die ich bringe, werden sich auf Druiden beziehen, einfach aus dem Grund, weil ich selber einen Druiden spiele und es mir an Erfahrung mit anderen Klassen mangelt. Der generellen Nützlichkeit dieses Threads soll das aber keinen Abbruch tun, da es wie gesagt nur Beispiele sind. Ich versuche die Beispiele zu wählen, dass ich nicht erklären muss, was die verwendeten Funktionen tun. Die meisten haben auch sehr aufschlussreiche Namen, sollte also gar nicht nötig sein. Dafür gib außerdem den Refferenz-Teil und die Links.
Bitte beachten: Viele Beispiele machen im Spiel wenig Sinn, sie dienen lediglich dazu die Erklärung eines Zusammenhangs griffiger zu machen.

Inhalt:
1) Makros allgemein
1.1) Hello World
1.2) Spells und Fähigkeiten in Makros verwenden
1.3) Grenzen und Verbotenes
1.4) Kleine Tricks

2) Scripte
2.1) Scripte allgemein
2.2) if-else-Verzweigung
2.3) for-Schleife
2.4) Arrays
2.5) Schleifen mit Abbruchbedingung
2.5.1) while-Schleife
2.5.2) repeat-Schleife
2.6) Typisierung
2.7) Rückgabe mehrer Werte
2.Cool Ein abschließendes ausführliches Beispiel

3) Gerüchte

4) Referenz
4.1) Spells und Abilities
4.2) Befehle fürs Pet
4.3) Interface und Interaktion mit der Welt
4.4) Inventar
4.5) Mathematik Zeichenketten
4.6) Funktionen die Informationen liefern
4.7) Klassenspezifisches
4.7.1) Druide
4.7.2) Hexer
4.7.3) Jäger

5) Links

6) Ein paar abschließende Worte
Badeye
Badeye

Anzahl der Beiträge : 327
Alter : 33
Ort : VS-Schwenningen
Anmeldedatum : 12.02.08

Ingame Charakter
Name: Kealthazzad
Klasse: Todesritter

Nach oben Nach unten

Addons Makros Empty Re: Addons Makros

Beitrag von Badeye So Jul 26, 2009 4:04 pm

1) Makros:
Ein Makro ist im Prinzip so etwas wie eine Liste von Befehlen, die nacheinander abgearbeitet. Prinzipiell läßt sich mit einem Makro alles machenwas man auch sonst machen. Einiges geht besser, anderes gar nicht, oder nur teilweise. Die meisten Einschränkungen sind erst später dazu gekommen, weil irgendwelche Trolle Möglichkeiten gefunden haben, sich durch Makros unfaire Vorsteile zu beschaffen. So war es zB möglich mehrere Totems gleichzeitig zu platzieren, was das Micro-Management für Schamanen erheblich reduziert hat.

1.1) Hello World
Unser Erstes Kind wird in alter Tradtion ein kleines Hello-World Makro sein. Starten wir den Makro Editor. Das kann auf 2 Anten geschehen. 1: Im Hauptmenu auf "Makros" klicken oder 2: Durch eingeben von "/macro" "/makro" oder schlicht "/m" in den Chat. Als erstes erstellen wir ein neues Makro durch klicken von "Neu" und wählen einen Namen und ein Symbol für unser Makro. Ich nenne es "Hello". In den großen Textbereich geben wir unsere Befehle ein:

code:
/winken
/say Hello World


Durch klicken von "Fertig" bestätigen wir und können von nun an unser Makro nutzen. Im oberen Teil des Makro-Editors sind die Makros mit ihren Namen und Synbolen zu finden. Sie lassen sich genau wie Fähigkeiten aus dem Spell-Book auf eine Aktionsleite ziehen. Einem Makro direkt eine Taste zuzuweisen ist leider nicht möglich, aber man kann sich behelfen, indem man sie auf eine unbenutzte Leiste zieht und dem Knöpchen dann eine Taste zuweist. Starten wir unser Makro. Unser Alterego nun die Welt grüßen und dabei nett winken. Alles was man in die Chat-Leite eingeben kann, kann auch in einem Makro verwendet werden.

1.2) Spells und Fähigkeiten in Makros verwenden:
Spells in ein Makro einzubauen ist auch möglich, die Syntax (in etwa Gramatik einer Programmiersprache) ist jedoch etwas sperrig. Für gewöhnlich lautet der Aufruf eines Spells:

/wirken spellname(Rang X)
"X" muss die gewünschte Stufe des Sepells ersetzt werden. Am einfachsten besorgt man sich die Namen der Spells, indem man während man ein Makro eingibt gleichzeitig das Spellbook öffnet und auf den gewünschten Spell shift-linksklickt.
Ein kleiner Tipp: Alles was einen Cooldown hat, bekommt ja einen netten Ausgegrauten Knopf mit uhrzeigerartig verschwindendes Ausgegrautheit (I'm the master of formuliering). Die Info über den Cooldown, holt sich das Makro aus dem ersten Spell, den es im Makro findet.

1.3) Grenzen und Verbotenes
Aufgrund massivem Mißbrauchst von Makrs hat Blizzard es unmöglich gemacht mehrere Spells in ein und demselben Makro aufzurufen aufzurufen. Das ist für einiges was man vielleicht machen möchte ärgerlich, aber lässt sich auch als Möglichkeit verwenden, nette Sachen zu machen, die sonst wesentlich mehr Aufwand wären. Dazu später mehr.
Makros können maximal 256 Zeichen lang sein. Um einem Gerücht und viele Fragen vorzugreifen: Dass man kann pro Makro nur genau einen Spell auslösen kann, heißt nicht, dass nicht mehrere drin stehen können. Ein kleines Beispiel:

1.4) Kleine Tricks:

code:
/wirken Verheeren(Rang X)
/wirken Schreddern(Rang Y)


Das ist ein einfaches Druiden-Makro für die Katze. Die Katze hat 2 Angriffe die von hinten ausgeführt werden müssen. Diese beiden unterscheiden sich lediglich darin, dass der Stärkere (Verheren) zusächtzlich im Tarnmodus ausgeführt werden muss, also ein klassischer Opener ist. Der andere (Shreddern) kann jederzeit ausgeführt werden, zB wenn der Gegner flieht oder ein Tank dafür sorgt, dass wir von hinten draufhauen können. Das Makro versucht erst Verheren auszuführen. Wenn das klapp, wird Schreddern gar nicht mehr probiert. Oder andersrum: Wenn man nicht getarnt ist, kann man auch nicht Verheren, das Makro Shreddert aber unseren Gegner. Ergebnis: Ein Knopf gespart.

2) Scripte:
... sind eine etwas aufgebohrtere Variante von Makros. Scripte werden nicht durch einfache Aneinanderreihung von Befehlen zusammengesetzt, sondern in der vollwertigen Programmiersprache LUA verfasst. LUA ist eine klassische Script-Sprache wie zB Python oder Perl. Der Anspruch von LUA ist es möglichts einfach zu sein, dabei aber viele Möglichkeiten zu liefern. LUA zu lernen heißt Programmieren zu lernen. Also macht euch keine Illusionen was die "Schwierigkeit" von LUA anbelangt. Trotzdem ist LUA ein guter Einstiegspunkt um anzufangen. In den Links werde ich auf einige Tutorials verlinken.
Alles was hinter 2 Minuszeichen steht, ist ein Kommentar und wird vom LUA-Interpreter ignoriert. Ich werde Kommentare verwenden um Anmerkungen in Codebeispielen zu machen.

2.1) Scripte allgemein:
Scripte werden in folgender Form in Makros eingeleitet:

code:
/script <LUA-Code>


LUA ist eigentlich keine whitespace-sensitive Sprache, das heißt Zeilenumbrüche spielen keine Rolle. Innerhalb von Makros ist es jedoch so, dass alles auf der selben Zeile stehen muss. Am besten entwickeln man seine Scripte mehrzeiling und löscht sobald man fertig ist, die Zeilenumbrüche. Auch für Scripte gilt die Einschränkung von maximal 256 Zeichen (inclusive dem einleitenden "/script"). LUA ist case-Senstive, da heißt es macht einen Unterschied ob man "genialerbefehl" oder "GenialerBefehl" schreibt. Also: anders als in vielen Sprachen macht Groß/Kleinschreibung einen Unterschied. Vorteile eines Scripts gegenüber einem Makro sind vornehmlich seine Kontroll- und Schleifenstrukturen. Es ist nicht möglich aus einem Script ein anderes Script auszuführen (Bots!). Ein Script ist immer eine "geschlossene Sache".

2.2) if-else-Verzweigung
Das dürfte mit das erste Feature sein, dass ein Script mächtiger macht als ein Makro.

Allgemeine Form:

code:
if <Bedingung> then
<Befehle1>
else
<Befehle2>
end


Diese allgemeine Form, testet ob <Bedingung> wahr ist, wenn ja werden die <Befehle1> ausgeführt, wenn nein <Befehle2>
Ein IF wird IMMER mit einem END abgeschlossen. Der ELSE-ZWeig ist nicht zwingend vorgeschrieben, kann also bei Bedarf weggelassen werden.

Eine erweiteret Form (eingentlich nur eine Kurzschreibweise) findet sich für mehrere hintereinander stehende IFs:

code:
if <Bedingung1> then
<Befehle1>
elseif <Bedingung2> then
<Befehle2>
--[und so weiter] <- Dies ist ein Kommentar und hat nix mit der Funktionalität zu tun
elseif <BedingungX>
<BefehleX>
else
<BefehleZ>
end


Hier werden solange die Bedingungen getestet, bis LUA die erste wahre Aussage findet. Die zugehörigen Befehle werden dann ausgeführt. Ist nichts wahr, wird der ELSE-Zweig ausgeführt. Dieser kann kann auch weggelassen werden.

Ein kleines Beispiel:

code:
CastSpellByName("Healing Touch(Rank X)")
if UnitIsEnemy("player", "target") then
SpellTargetUnit("player")
end



Hier die von Umbrüchen befreite Form für den tatsächlichen Einsatz:

code:
/script CastSpellByName("Healing Touch(Rank X)") if UnitIsEnemy("player", "target") then SpellTargetUnit("player") end


Muss natürlich alles auf einer Zeile stehen. In Zukunft schnek ich mir die bereinigte Form.

Hier passiert Folgendes:
Es wird "Heilberührung" gecastet. Das geht natürlich nur auf freundliche Einheiten. Wenn man einen Feind im Visier hat, wird einfach nur der Mauszeiger aufgeladen. Das Script testest ob man einen Feind anvisiert, solltes das der Fall sein, so wird der Spruch auf der Caster selbst "umgelenkt". Ein klassisches Self-Cast-Script.

2.3) for-Schleifen:
...sind Schleifen die einen Gruppe von Befehlen wiederholen.
Für Programmierer: Im Gegensatz zu vielen klassischen Sprachen ist FOR in LUA eher arytmetischer Struktur. Es ist gefährlich zu versuchen innerhalb der Schleife in die Bedingung einzugreifen (/me wift Zäune auf C-Fans).

code:
for <variable>=<start>,<stop>,<step> do
<befehle>
end


Hier erzeugt man eine Variable. Die Schleife wird für <varibale>=1 ausgeführt und dann immer wieder mit der Variablen um <step> erhöht, solange bis <variable>=<stop> erreicht ist. <Step> kann weggelassen werden, dann gilt <step>=1.
Grosser Brocken Theorie, kleines Beispiel:

code:
for r=10,1,-1 do
CastSpellByName("MarkOfTheWild (Rank "..r..")")
end


Die Schleife zählt von 10 nach 1 herunter und versucht jedesmal einen Buff zu wirken. Der erste der funktioniert (Stufe des Ziels zu niedrig, wenig Mana, Rang noch nicht gelernt, ...) wird gesprochen. Wegen dem Cooldown werden auch nicht 10 Zauber gewirkt, sondern nur der erste der passt. Natürlich gib's beim Aufruf jede Menge Fehlermeldungen, verschont einen aber davor im Spellbook nach der passenden Stufe wühlen zu müssen.
Im Beispiel gibs eine weitere Neuerung: Der Konkatenations- oder Verbindungs-Opeartor "..". Innerhalb von CastSpellByName(<string> ). Wird für <string> der NAME eines Spells erwartet. Dort steht also nicht der Aufruf des Spell selbst, sondern sein Name. ".." Verbindet 2 Zeichenketten. Nach ...Rank " wird die Zeichenkette unterbrochen, dann mit ".." der aktuelle Wert von r (läuft ja rückwärts von 10 bis 1) angehängt und mit einem weiteren ".." die noch fehlende schließende Klammer angehängt. Tolle Sache oder?
Neben dieser FOR-Variante existiert in LUA noch eine weitere, die die Elemente für <variable> aus einer Funktion bezieht. Diese macht für WoW Scripting aber

kaum Sinn, und ich erkläre hier bestimmt keine anonymen Funktionen und Lambda-Operationen. Wer das trotzdem wissen will geht hier hin: http://www.lua.org/pil/4.3.5.html
Badeye
Badeye

Anzahl der Beiträge : 327
Alter : 33
Ort : VS-Schwenningen
Anmeldedatum : 12.02.08

Ingame Charakter
Name: Kealthazzad
Klasse: Todesritter

Nach oben Nach unten

Addons Makros Empty Re: Addons Makros

Beitrag von Badeye So Jul 26, 2009 4:05 pm

2.4) Arrays:
...sind Listen von Einträgen. Arrays müssen in LUA nicht zwingend gleichtypisierte Einträge haben, ich gehe aber nicht weiter auf diese Möglichkeit ein.

Array werden einer Variablen zugeordnet, und man greift auf die einzelnen Elemente per Index zu. Das Erste Element ist "var[1]" und nicht "var[0]" (Noch ein Zaun für die C-Fans).

code:
r={10,9,8,7,6}
CastSpellByName("Healing Touch (Rank "..r[1]..")")
CastSpellByName("Healing Touch (Rank "..r[2]..")")
CastSpellByName("Healing Touch (Rank "..r[3]..")")
CastSpellByName("Healing Touch (Rank "..r[4]..")")
CastSpellByName("Healing Touch (Rank "..r[5]..")")


Abgesehen davon, dass hier viel zu viele Zeichen verwendet worden sind, wär eine Schleife wesentlich klüger gewesen. ABer ich denke das Prinzip ist klar. Wer ein besseres Beispiel machen kann, soll es posten. Ich tausche es dann aus.
Vielleicht tüftelt mal jemand ein Script zusammen, dass den kleinsten Heilspruch einer Sporte nimmt, der Zur vollen Heilung des Ziels ausreicht. Dafür nimmt man so eine Liste, die die Heilpunkte der verschiedenen Ränge enthält.

2.5) Schleifen mit Abbruchbedingung:
... sind For-Schleichen ähnlich. Bei For-Schleifen ist jedoch vorher schon bekannt, die oft die Schleife durchlaufen wird. Wenn man es genau nimmt ist eine For-Schleife nur die Kurzschreibweise für eine While-Schleife:

2.5.1) While-Schleife:

code:
x=10
while x>0 do
CastSpellByName("MarkOfTheWild (Rank "..x..")")
x=x-1
end


Dies ist unser schon bekanntes Buff-Makro als While-Schleife. Die Schleife wird so lange durchlaufen wie die Bedingung wahr ist. In unserem Fall solange x postiv ist. Mann kann Schleifen auch mit Gewalt unterbrechen. Oft genug ist das sogar die eleganteste Lösung. Der Befehlt dazu heißt "break".

code:
x=10
while 1==1 do
CastSpellByName("MarkOfTheWild (Rank "..x..")")
x=x-1
if x>0 then break end
end


Das ist ein Nonsens-Beispiel, aber es dürfte klar sein, wie man break verwendet. Mit break können auch reapeat- und for-Schleifen unterbrochen werden. Eine weitere Amerkung: in der Bedingung steht 1==1 das ist eine Bedingung die einfach immer wahr ist. "==" ist ein Vergleichsoperator, bitte nicht mit "=" verwechseln, das ist ein Zuweisungsoperator. Man hätte auch "while true do..." schreiben können. "true" is ein s.g. Bool'scher-Wert der Wahrheit repräsentiert. Alle Aussagen die die irgendwo getestet werden, werten entweder zu "true" oder seinem Bruder "false" (unwahr) aus.

2.5.2) repeat-until-Schleifen:
... sind genau wie while-Schleifen. Bei while wird jedoch VOR dem Schleifendurchgang die Bedingung getestet, bei repeat-until jedoch erst danach. Im wesentlichen ist der Unterschied, dass repeat-Schleifen garantiert mindestens einmal durchlaufen werden, while-schleifen jedoch nicht unbedingt.

code:
repeat
<befehle>
until <bedingung>


Kein explizites Beispiel diesmal.

2.6) Typisierung
LUA ist ein dynamisch getype Sprache. Man muss einer Variablen nicht sagen, welcher Art die Werte sind, die sie enthält. Jeder Variable kann Wahrheitswerte, Null-Pointer (=NaN Wert 'nil'), Zahlen, Strings und sonst noch was aufnehmen. Alle nicht-Programmierer können diesen Abschnitt ignorieren, in LUA funktioniert fast alles weutgehend intuitiv. Wer noch nicht "verdorben" wurde, muss das auch nicht wissen.

2.7) Rückgabe mehrerer Werte
Einige Funktionen geben mehrere Werte gleichzeitig zurück. Diese werden an Variablen gebunden, die komma-seperiert notiert werden.

code:
i,n,a = GetShapeshiftFormInfo(f);


Hier gibt die Funktion 3 Werte zurück.

2.Cool Ein abschliessendes ausführliches Beispiel
Was wollen wir machen:
Also jeder der nen Feral-Druiden spielt kennt das Problem. Die Shortcuts zum Shiften sind ätzend verteil, wenn man zu Caster zurückshiftet, muss man genau den richtigen Knopf drücken, und falls man seine Shifts auf ne andere Leiste gepackt hat, darf man auch noch die Leiste wieder zurückdrehen. Darüber hinaus
geht Reisegestalt nur an Land, Wassergestalt nur im Wasser -> Ein Knopf zuviel. Höche Zeit für ein Script. Am Ende wollen wir 3 Knöpfe haben, einer für den Bär, einer für die Katze, und einer für die Reiseformen. Jeder Konpf soll aus jeder Form zum Caster zurückschiften können. Um von Katze auf Reisegestalt zu wechseln soll es also nur nötig sein 2x auf unseren Reiseknopf zu drücken.

Der naive Ansatz (Für den Bär) als einfaches Makro:

code:
/wirken Terrorbärengestalt(Gestaltwandel)
/wirken Katzengestalt(Gestaltwandel)
/wirken Reisegestalt(Gestaltwandel)
/wirken Wassergestalt(Gestaltwandel)



Die erste Verwandlung die "passt" wird gemacht. Ist man Caster, so wird man Bär (steht ja ganz oben). Sonst tritt die erste Verwandlung due einen zurückbringt. Wenn man damit spielt, wird man allerdings sein Blaues Wunder erleben. Und zwar: Hat man Zuwenig Mana um eine der Kampfformen anzunehmen, findet man sich plötzlich in Reiseform wieder. Die kosten nämlich weniger Mana. Autsch! Darüber hinaus gibs jedesmal 3 Fehlermeldungen, das wollen wir dann doch noch was reduzieren. Ein vernünftig Script muss her.

Welche Funktionen sind nützlich:
Zuerst brauchen wir etwas um zu testen in welcher Form wir uns grade befinden. GetShapeShiftFormInfo() ist genau richtig. Diese Funktion erwartet eine Zahl

als Argument:
1=Bär
2=Wasserform
3=Katze
4=Reiseform
...und gibt 3 Werte zurück: den index, den Namen, sowie "1" falls die Form aktiv ist sonst "0". Davon interessiert uns nur der Dritte.

Dann brauchen Wir noch ne Funktion die uns verwandelt: CastShapeShiftForm(). Erwartet eine Zahl. Die Codierung ist die selbe wie oben.

Dann wollen wir noch was zum Leisten verdrehen:
CURRENT_ACTIONBAR_PAGE ist eine Variable die die aktuelle Leiste enthält. Man kann ihr einen neuen Wert duch eine einfache Zuweisung geben. Mit ChangeActionBarPage() weist man WoW an, die Leiste auf den grade zugewiesenen Wert zu drehen. Wir wollen das zumindest wenn wir Tier werden. Also ICH will das, geht mich ja nix an wie IHR eure Tasten belegt habt

Unser Script soll nachgucken ob man in Tierform ist, wenn ja -> zurückverwandeln. Wenn nein -> Tierwerden. Für den Reise/Wasser-Button nehmen wir da wieder den naiven Ansatz und versuchen einfach beides, eins wird immer klappen.

Hier der Code für den Bären:

code:
b = 0;
for f = 1, 4 do
i, n, a = GetShapeshiftFormInfo (f);
if a == 1 then
CastShapeshiftForm (f);
b = 1;
end;
end;
if b ~= 1 then
CastShapeshiftForm (1); -- Hier würden Für den Reisebutton 2 Zeilen stehen. Form 2 und 4
CURRENT_ACTIONBAR_PAGE=1;
ChangeActionBarPage();
end



Am Anfang machen wir uns eine neue Variable b=0. Wofür die gut ist erkläre ich später. Dann gucken wir mit Hilfe einer For-Schleife nach, ob wir schon eine Tierform haben. GetShapeShiftFormInfo würde in diesem Fall a=1 zuweisen, als Zeichen, dass die Form aktiv ist. In diesem Fall setzen wir b=1, damit merken wir uns, dass wir uns schon verwandelt haben, das brauchen wir später ... und verwandeln uns zurück. Im 2ten Teil des Scripts gucken wir nach ob wir schon geshiftet haben (haben wir uns mit b=1) gemerkt. Wenn ja -> nix weiter, wir sind fertig (~= testet auf ungleichheit). Wenn nein -> Verwandeln in die Form die zu unsem Knopf passt. Hier wäre das der Bär (Form 1). Und natürlich die Tierleiste aktivieren. Unser Script beschützt uns vor versehentlich Reiseformen, dreht uns die Leiste zurecht und frisst die meisten Fehlermeldungen. Nur beim Wandeln Caster->Reiseform gibs noch ne Fehlermeldung. Sobald ich raus habe wie man testet ob man im Wasser ist, ist auch die Geschichte.
Badeye
Badeye

Anzahl der Beiträge : 327
Alter : 33
Ort : VS-Schwenningen
Anmeldedatum : 12.02.08

Ingame Charakter
Name: Kealthazzad
Klasse: Todesritter

Nach oben Nach unten

Addons Makros Empty Re: Addons Makros

Beitrag von Badeye So Jul 26, 2009 4:05 pm

3) Gerüchte
Es wird immer wieder behaupte es wäre unmöglich mehrere Spells in einem Script zu wirken. Das ist falsch. Das Problem ist, dass es der Cooldown, nach jedem Cast nicht erlaubt, schon wieder einen zu wirken.

Es wird immer wieder behauptet, man könnte keine Pause einbauen. Das ist genauso falsch. Man muss etwas tiefer im Interface rumwurschteln, jedoch ist es möglich. Blizzard ist das herlich egal, den Vorteile kann man sich dadurch nicht erkaufen. Bitte keine Fragen dazu in diesem Thread.

Es gibt immer wen der behaupten wird, ein Makro geschrieben zu haben, dass automatisch Heiltränke trinkt oder etwas in dieser Richtung. Ein Makro wird nie eigenständig auf Ereignisse in der Welt reagieren können zu denen Blzzard nicht meint, dass man auf sie reagieren können dürfen sollte. Ganz egal was man anstellt. Schafft man es doch, so ist man ein Cheat-Programmierer, nichts anderes.

Makros können maximal 255 Zeichen enthalten. Das ist auch nicht ganz richtig das ist eine künstliche Einschränkung von Blizzard, die einen Scripter auf die richtige Bahn lenken soll. Diese "Sperre" ist recht einfach auszuhebeln wer wissen wie soll mal nach "Big Makro" googlen. In diesem Thread gehe ich nicht darauf ein, dies ist ein Thread zu LUA und ein Einstiegspunkt für Anfänger.

4) Referenz
Hier sammle ich mal die wichtigsten, NICHT alle Befehle. Einige werde ich mit Kommentaren versehen. Dies soll eine Liste werden die Neulinge befähigt mächtige Scripte zu schreiben ohne von den diversen -teils gigantischen- Listen erschlagen zu werden, die da draußen existieren.

4.1) Spells und Abilities
CastSpellByName("name")
DER Befehl. Nicht das Salz in der Suppe, sondern das Wasser. Suppen ohne Salz gibt es, Suppen ohne Wasser dagegen nicht.
Wirkt einen Spruch oder eine Fähigkeit. Erwartet den Namen als Zeichenkette. Fausregel: Immer in Anführungszeichen. Hat der Spruch einen Rang, so MUSS der Rang angegeben werden. Auf deutschen Versionen wird die deutsche Bezeichnung erwartet, statt "xyz (Rank {zahl})" schreibt man hier "xyz (Rang {zahl}".

SpellIsTargeting()
Gibt "true" zurück, falls "der Mauszeiger mit einem Spruch aufgeladen" ist. Kann direkt so verwendet werden:
if SpellIsTargeting() then {irgendwas}
Wichtiges Gewürz in fast allen Selfcast-Scripten.

SpellStopTargeting()
"Reinigt" einen aufgeladenen Cursor. Wie ein Rechtsklick in freien Bereich.

SpellTargetUnit(name)
Wirk einen Spruch auf "name". Vorteil hier ist, dass das aktuelle Ziel nicht aus dem Fokus gerät. Wirkt so wie wenn man einen freundlichen Spruch auf den Mauszeiger läd, und dann auf einen freundlichen Spiel "abschiesst".

AttackTarget()
Beginnt angreifen. Macht das blinkenden angreifen Symbol blinkend


4.2) Befehle für's Pet
PetAggressiveMode()
Stellt das Pet auf "Aggressiv"

PetDefensiveMode()
Stellt das Pet auf "Defensiv"

PetPassiveMode()
Stellt das Pet auf "Passiv"

PetWait()
Stellt das Pet auf "Stehenbleiben"

PetFollow()
Stell das Pet auf "Folgen"

PetAttack()
Läßt das Pet angreifen

TogglePetAutocast(index)
Schaltet einen Spruch des Pets an oder aus.


4.3) Interface und "Interaktion mit der Welt"

ClearTarget()
Auf nichts zielen

TargetByName(name)
Nimmt ein Ziel über den NAmen ins Visier.

TargetLastEnemy()
Nimmt den Feind ins Ziel, auf den als letztes gezielt wurde.

TargetNearestEnemy()
Zielt auf den a nächsten stehenden Feind.

AssistUnit(name)
Ziel auf das Ziel von Name. Das selbe wie /assist in Makros.


4.4) Inventar
DropItemOnUnit("unit")
Lässt den Genstand auf "unit" fallen, der grade am Mauszeiger klebt. Sehr praktisch für Tierfüttern Makros.

AutoEquipCursorItem()
Legt etwas an, das grade am Cursor klebt. Hat den selben Effekt, als wenn man auf einen Ausrüstungsgegenstand im Inventar rechtsklickt.

DeleteCursorItem()
Wirft etwas das am Cursor kleb weg, ZERSTÖRT es!
Niemals in Ausrüstung-Wechsel-Makros verwenden. NIE NIE NIE.

CursorHasItem()
True falls eine Gegenstand am Mauszeiger klebt, sonst false.

PickupContainerItem(bag, slot)
Nimmt den Gegenstand der in Tache "bag" an der Stelle "slot" liegt auf sodass er am Mauszeiger klebt. Taschen werden von rechts nach links nummeriert. Der Rucksack ist Tasche "0". Die Slots werden reihenweise von oben nach nach unten nummeriert. Die Slotnummerierung beginnt mit "1" nicht wie bei den Taschen mit "0". Damn you Blizzard!
Wenn schon etwas am Cursor hängt, wird der Gegenstand auf den Platz gelegt, und der dort liegende aufgenommen.
Populäre Sache in Ausrüstung-wechsel-Scripten.

PutItemInBag(bag)
Etwas das am MAuszeiger kleb, in eine Tasche stopfen.

4.5) Mathematik und Zeichenketten
strfind(string, muster)
Findet eine Zeichenkette (muster) in einer anderen (string). Kann zB für Totemkiller verwendet werden, die nur niedrigstufige Spells auf Totems verschiessen. Rückgabe ist die erste auffindebare Position oder "nil" (Der Nullrückgabewert) falls nicht gefunden.

strlen(string)
Gibt die Anzahl der Zeichen in der Zeichenkette "string" zurück.

abs(zahl)
Betrag einer Zahl. "Gibt den Wert einer Zahl ohne ihr Minuszeichen (falls vorhanden) zurück)

4.6) Funktionen die Infos liefern
UnitHealth(unit)
Liefert die verbliebene Gesundheit von "unit" in Prozent.

UnitHealthMax(unit)
Liefert die maximale Gesundheit der Einheit

UnitMana()
UnitManaMax()
Das selbe wie die beiden ersten. Halt für Mana.

UnitIsEnemy(unit)
true für Feinde, false für Freunde oder Neutrale.

UnitIsFriend(unit)
true für Freunde und neutrale, false für Feinde.

IsAltKeyDown()
IsShiftKeyDown()
IsControllKeyDown()
true wenn SHIFT, ALT bzw STEUERUNG gedrückt sind, sonst false. Praktisch wenn man Mehrfachbelegungen über Scripte realisieren mag, zB Tank-Heil Makros. Ich persönlich finde das Schwachmatentum hoch 10, aber einige werden damit glücklich


4.7) Klassenspezifisches
Hier sind Vorschläge für ergänzungen immer gerne gesehen. Ich werde verscuchen den Thread von Zeit zu Zeit zu überarbeiten. Ich bi leider keinen von denen die WoW seit US-Beta spielen. Faktisch hab ich noch nie ne 60 neben meinem Portrait gesehen. Entsprechend wenig Ahnung hab ich von den niederen Klassen (als alle die keine Druiden sind ). Bei diesem Aschnitt brauche ich eure Hilfe.

4.8.1) Druide
CastShapeShiftForm(index)
Shiften in eine andere Form. index ist die gewünschte Form:
1: Bär
2: Wasserform
3: Katze
4: Reiseform

n,i,a = GetShapeshiftFormInfo(index)
Liefert Infos über die aktuelle Form. a ist eins, falls die Form aktiv ist, sont 0. n=name. i=index.

4.8.2) Hexer
siehe Pet-Befehle

4.8.3) Jäger
siehe Pet-Befehle


5) Links
LUA:
Die Heimat von LUA: http://www.lua.org
Die Refferenz zu LUA: http://www.lua.org/manual/5.0/

Scripting:
WoW Wiki (DIE Quelle für alles "anspruchsvollere" Wissen zu WoW): http://www.wowwiki.com
Die Sammelstelle im Wiki zu den LUA-Funktionen von WoW: http://www.wowwiki.com/World_of_Warcraft_API
Blizzards offizielle "Interface" Forum. Viele Threads zu Makros (in extrem gemischter Qualität): http://forums-de.wow-europe.com/boa...ow-interface-de

6) Ein paar abschließende Worte:
Makros können extrem tolle Sachen machen. Das will heißen, mit Makros kann man viele Sachen anstellen, die man so nicht erwartet hätte. Jedoch besteht auch immer die Gefahr, dass man etwas "überautomatisiert", und sich damit eine Menge Freiheiten nimmt, statt welche zu schaffen. Ein Makro dass einem eine Entscheidung abnimmt, die man zu 100% sowieso getroffen hätte, ist ein gutes Makro. Alles andere ist ein schlechtes Makro. Ein Makro sollte nie den Spielstil beeinflussen. Leider ist das allzu häufig der Fall. 95% dessen was in Makro-Foren gepostet wird, sind schlechte Makros (In Sinne MEINER Definition, die ihr ja nicht teilen müsst). Sehr viele Scripte werden auch einfach aus dem selbern Grund geschrieben und veröffentlicht aus dem ein Hund seine Klöten leckt: Einfach weil man es kann. Der Sinn dahinter ist oftmals nicht mehr als der sportlicher Anreiz etwas zu machen, das sonst nicht geht, eine elegante Methode für etwas kompliziertes zu finden oder einfach Spass am Programmieren oder dergleichen.

Und ja: Es wird immer jemanden geben der eine Methode findet mit Scripten und Makros unfaire Vorteile für sich herauszuholen. Blizzard kennt die Schwachstellen auch. Mit jedem Makro mehr, das man verwendet begibt man sich in die Gefahr sich etwas anzugewöhnen, dass irgendwann nicht mehr funktionieren wird. Ein vollkommen zerrissenes Spielgefühl kann die Folge sein. Man sollte sich bei jedem Makro fragen "Brauch ich das wirklich?".

Zum Programmieren an sich: LUA ist vielleicht in den Augen einiger Programmierkundiger eine etwas merkwürdig Sprache. Am anderen Ende, jedoch eine die in den meisten Fällen genau das tut was sie soll. Wer nicht programmieren kann, oder nie über Turtle-Pascal in der Schule hinausgekommen ist, wird in der Regel keine großen Probleme "aufzuholen". Manchmal jedoch kommt man einfach nicht weiter. Wenn man Hilfe braucht, sollte man zuerst einmal veruschen rauszufinden, ob nicht schonmal jemand die selbe Idee hatte, und dann entsprechend nachfragen. Makro-Progger sind oft genug Menschen die sich gerne in ihrer eigenen Genialität sonnen. Leider führt das manchmal dazu, dass sie denken etwas herablassend auf vermeindlich blöde Fragen reagieren zu müssen. Werd bloß nicht so, wenn Du Vortschritte machst.

Nochwas: Dieser Thread lebt vom mitmachen. Neue Links sind immer willkommen. Neue Befehle die ich vergessen oder übersehen habe oder einfach nicht kenne könnt ihr gerne posten, ich werd dann mal gucken ob sie nicht zu spezifisch sind, aber aller Wahrscheinlichkeit gerne einbauen. Gleiches gilt die Jagt nach Fehlerteufeln. Bitte suchen helfen!
Badeye
Badeye

Anzahl der Beiträge : 327
Alter : 33
Ort : VS-Schwenningen
Anmeldedatum : 12.02.08

Ingame Charakter
Name: Kealthazzad
Klasse: Todesritter

Nach oben Nach unten

Addons Makros Empty Re: Addons Makros

Beitrag von Badeye So Jul 26, 2009 4:07 pm

bitte nicht wunder hab den tet genau übernoimmen wie ich ihn fand wollte mal probieren ob ich n paar makros hinbekomme um ganze sequencen für maximal DPS usw hinzubekommen oder eventuell addons <.<

und nein ich möchte nicht geflamed werden jezz^^

noch n paar Links:
http://forums.wow-europe.com/thread.html?topicId=2843989023&sid=3
Badeye
Badeye

Anzahl der Beiträge : 327
Alter : 33
Ort : VS-Schwenningen
Anmeldedatum : 12.02.08

Ingame Charakter
Name: Kealthazzad
Klasse: Todesritter

Nach oben Nach unten

Addons Makros Empty Re: Addons Makros

Beitrag von Kanerin So Jul 26, 2009 10:41 pm

G19 Tastatur kaufen, Jäger spielen.
Zwar net max DPS aber zum leveln und nebenbei TV schauen ideal.
avatar
Kanerin

Anzahl der Beiträge : 122
Alter : 53
Ort : Wien
Anmeldedatum : 12.05.08

Ingame Charakter
Name: Kanerin
Klasse: Magier

Nach oben Nach unten

Addons Makros Empty Re: Addons Makros

Beitrag von Gast So Jul 26, 2009 11:27 pm

Kanerin schrieb:G19 Tastatur kaufen, Jäger spielen.
Zwar net max DPS aber zum leveln und nebenbei TV schauen ideal.


G19 *sabber*
Anonymous
Gast
Gast


Nach oben Nach unten

Addons Makros Empty Re: Addons Makros

Beitrag von Badeye Fr Jul 31, 2009 10:59 am

mit der g19 lassen sich sicher Bot makros machen um auf Max dps kommen die sind in WoW nicht mehr möglich Atacken in IF anweisungn lassen error entstehen <.<
Badeye
Badeye

Anzahl der Beiträge : 327
Alter : 33
Ort : VS-Schwenningen
Anmeldedatum : 12.02.08

Ingame Charakter
Name: Kealthazzad
Klasse: Todesritter

Nach oben Nach unten

Addons Makros Empty Re: Addons Makros

Beitrag von Meldoria Fr Jul 31, 2009 2:39 pm

Dazu wollte ich noch hinzufügen, dass die WoWWiki bei der Grafikprogrammierung extrem veraltet ist und teilweise schon kein 2.0er Niveau mehr hat. Das bedeutet, dass sie die Antibotpolitik noch gar nicht drinn hat und man deswegen Beispiele gar nicht nachprobieren kann.
Aber danke für den einen Forenlink - der sieht da ganz hilfreich aus als Referenz für den XML - Käse.

Makros zum Gesundheitsstein schlucken sind praktisch - dann nimmt man den egal ob (un)geskillter Stein im Gepäck. Dazu habe ich meine Spezialfähigkeiten mit Spruchmakros kombiniert so wie zB Slimmer.
Meldoria
Meldoria

Anzahl der Beiträge : 375
Anmeldedatum : 20.11.08

Ingame Charakter
Name: Meldoria
Klasse: Priester

Nach oben Nach unten

Addons Makros Empty Re: Addons Makros

Beitrag von Gesponserte Inhalte


Gesponserte Inhalte


Nach oben Nach unten

Nach oben

- Ähnliche Themen

 
Befugnisse in diesem Forum
Sie können in diesem Forum nicht antworten