[Guide][DE] Wie erstelle ich eine Custom Class - MMOCrawlerbots | WoW Bot Forum
Important: Please register to use the 20 minutes trial version or buy the bot!
Bot ready for World of Warcraft 5.4 Build 17538

UpdateLauncher DOWNLOAD

Wow Bot: CrawlerBot Last version: click here State: EU: working US: working

Author Topic: [Guide][DE] Wie erstelle ich eine Custom Class  (Read 4511 times)

September 27, 2012, 16:33:25 PM

riarry Offline

  • *
  • Posts: 1024
  • Reputation: 113
    • View Profile
Guide Custom Classes

Du willst also gerne eine Custom Class schreiben aber weißt nicht genau wie? Kein Problem!
Alle Custom Classes werden in einer Scriptsprache geschrieben die LUA heißt. Das heißt um eine Custom Class zu schreiben brauchst du LUA Grundkenntnisse. Zudem stellt der Bot ein paar Befehle bereit die du Benutzen kannst. In diesem Guide lernst du alles von Anfang an. Viel Spaß!

Ich teil den Post für die Übersicht etwas auf:
LUA Grundlagen
Befehle des Bots
Spell Ids und die erste Custom Class
Hinweiße, Tipps und Tricks
« Last Edit: September 28, 2012, 08:08:33 AM by riarry »
Great Multi-Area herb&Mine Profile: SuperFarm 2.0
Awesome Fishing 1-600 with Coinmaster Achievment
--- NO SUPPORT VIA PM ---

September 27, 2012, 16:33:39 PM
Reply #1

riarry Offline

  • *
  • Posts: 1024
  • Reputation: 113
    • View Profile
Variablen
Als erstes haben wir die Variablen. In Variablen werden Daten zwischengespeichert und es gibt verscheiden Typen für Buchstaben zahlen und Zustände. Den Type für Zustände nennt man auch Boolean und kann entweder true (wahr/ja) oder false (falsch/nein) beinhalten.
Variablen für Zahlen heißen number. Die Unterscheidungen sind wichtig, da man diese Tpyen nicht untereinander zuweisen kann. Eine Zahl bleibt immer eine Zahl, ein Boolean immer ein Boolean. Es gibt auch noch Zeichenketten die Buchsatben beinhalten. Der Inhalt muss immer in Anführungszeichen zugewiesen werden.

Beispiel:
Code: [Select]
a = 1
b = 2
c = true

ergebnis = a + b
fehler = a + b + c

zeichenkette = "Hallo!"
Ergebnis wird 3 sein, während die variable fehler einen Fehler verursachen wird, da man Zahlen nicht mit Zuständen addieren kann.

Übrigens in LUA müssen wir nicht, wie in anderen Programmiersprachen Typisch die variablen initialisieren, man könnte aber indem man das Schlüsselwort local benutzt.
Code: [Select]
local a=1
Funktionen
Da wir Funktionen für Custom Classes nicht dringend brauchen, hier nur ein kurzer Einblick: Eine Funktion ist eine Möglichkeit sich wiederhohlende Aufgaben zusammen zu fassen. Man kann sie mit Parametern aufrufen und sie gibt am Ende ein Ergebnis zurück.

Funktionen können ganz einfach mit ihrem Namen aufgerufen werden. Eine Funktion beginnt immer mit dem Schlüsselwort function Gefolgt von dem Namen und den Parametern. Ein Parameter sind Variablen die innerhalb der Funktion benutzt werden sollen. Mehrere parameter werden mit einem Komma getrennt. Eine Funktion endet immer mit einem end davor jedoch muss mit dem Befehl return etwas zurückgegeben werden.

Beispiel:
Code: [Select]
function [/b]NAME_DER_FUNKTION()
  return
end

function]addiere(_a, _b)
  return [/b]_a +_ b
end

ergebnis = addiere(1, 2)
Im ersten Beispiel wird nichts zurückgegeben. Trotzdem muss return vorhanden sein. Das zweite Beispiel addiert einfach 2 Zahlen und gibt das Ergebnis zurück.

Operatoren
Wichtig für uns sind die Vergleichsoperatoren. Hier eine Übersicht:
== Ist gleich
~= ungleich
< größer als
> kleiner als
<= größer oder gleich
>= kleiner oder gleich

Die logischen Operatoren können Benutzt werden um Bedingungen zu verknüpfen dafür gibt es folgende:

and beide Bedingungen müssen erfüllt sein
or eine Bedingung muss erfüllt sein
not bedeute eine Umkehrung "Wenn etwas nicht zutrifft."

Diese logischen Operatoren können miteinander Verknüpft werden. Ziemlich trokcendes theam aber Grundlage für Verzweigungen.

Verzweigungen
Das ist der Kernbereich für die Custom Classes.  Für eine Verzweigung prüft ob eine bedingung wahr ist und führt dann einen Anweisungsblock aus. Man muss genau wie bei Funktionen aber immer das Ende einer Verzweigung mit end angeben.
 Man muss sich das so vorstellen:

Wenn (Bedingung erfüllt ist) dann (mache ein paar Sachen) Ende.
Die Befehle dafür sind if (=Wenn) then (=dann) elseif (=wenn nicht, dann prüfe nächstes wenn) else (=andernfalls)

Hier ein beispiel für eine einfache Verzweigung. Wenn die Bedingung erfüllt ist führe die Anweisung aus:
if Bedingung then Anweisung end
Wenn die bedingung erfüllt ist dann soll Anweisung1 ausgeführt werden in allen andern Fällen anweisung2

if Bedingung then 
   Anweisung1
else
   Anweisung2
end


Wenn die Bedingung1 erfüllt ist dann soll Anweisung1 ausgeführt werden, wenn die bedingung2 erfüllt ist dann soll Anweisung2 ausgeführt werden in allen andern Fällen Anweisung3

if Bedingung1 then 
   Anweisung1
elseif Bedingung2 then
   Anweisung2
else
   Anweisung3 
end


Wir können Bedingungen mit auch logischen Operatoren Verknüpfen.

Beispiel:
Code: [Select]
if (1<2) then _Log("Puh Glück gehabt, 1 ist kleiner als 2") else _Log("Fehler. Bitte das Universum neu starten!") end

if (1<2 and 0==0) [b]then _Log("Puh Glück gehabt, 1 ist kleiner als 2 und 0 ist 0") else _Log("Fehler. Bitte das Universum neu starten!") end
Der Befehl _Log ist übrigens eine Funktion die der Bot zur Verfügung stellt.
Ach so bevor ich eines vergesse: Alle Anweisungen müssen mit einem Semikolon enden, wenn danach eine weitere Anweisung folgt.
« Last Edit: September 27, 2012, 17:53:05 PM by riarry »
Great Multi-Area herb&Mine Profile: SuperFarm 2.0
Awesome Fishing 1-600 with Coinmaster Achievment
--- NO SUPPORT VIA PM ---

September 27, 2012, 16:33:57 PM
Reply #2

riarry Offline

  • *
  • Posts: 1024
  • Reputation: 113
    • View Profile
Um eine Custom Class zu schreiben braucht man natürlich einige Befehle. Der Bot stellt dazu einige zur verfügung.

-- Achtung: Diese Liste ist unter Umständen unvollständig --

CastSpellByID(id, target, wait)
Benutzt einen Zauber. Es muss die SpellID angegeben werden. Der zweite Parameter gibt das Ziel an. Hier wird die Variable Target verwendet. Erklärung zu Target siehe GetAttacker(). Wird eine 0 angegeben wird der Bot auf sich selbst casten. Parameter 3 ist Optional und gibt ob gewartet werden soll bis der Spell fertig gezaubert wurde. Standard ist true und muss nicht angegeben werden.

Beispiel 1: Zauber "Feuerball" auf das akteuell Ziel des Bots und wartet bis der Cast zu Ende ist.
Code: [Select]
CastSpellByID(133 , Target);
Beispiel 2: Arkane Brillianz buffen
Code: [Select]
CastSpellByID(1459 ,0 );
HasBuff(id, wait)
Prüft ob der Bot einen bestimmten Buff hat. Es muss die Buffid angegeben werden. Parameter 3 ist Optional und gibt ob gewartet werden soll bis der Buff vorhanden ist. Standard ist true und muss nicht angegeben werden.

Beispiel 1: Arkane Brillianz Buffen. Er muss nicht warten bis der Buff vorhanden ist, es kann immer ausgeführt werden.
Code: [Select]
if not HasBuff(1459) IsSpellKnown(1459) then
_Log("Buff Arkane Brillianz");
CastSpellByID(1459 ,0 , true);
NextAction();
end
Beispiel 2: Pyro procc. Hier wird der zweite Parameter angegeben, weil gewartet werden soll bis der Buff da ist.
Code: [Select]
if HasBuff(48108) and IsSpellKnown(11366) then
_Log("Pyro!");
CastSpellByID(11366 , Target , true);
NextAction();
end

IsSpellKnown(id);
Prüft er der Zauber bekannt ist. Diese Abfrage sicherheitshalber immer erfolgen, da nicht für jeden Talentspecc oder Level alle Spells verfügbar sind. Der Parameter ist die Spellid. Rückgabe: Boolean (true/false)


GetAttackerCount();
Gibt die Anzahl an Gegnern zurück. Rückgabe: Zahl


GetAttacker();
Gibt die Gegner als sogenanntes Feld zurück. In diesem Feld stehen alle Gegner. Möchte man den ersten Gegener der Angreift kann man diesen mit GetAttacker(1) ermitteln. Es empfiehlt sich die variable Target zu verwenden. Rückgabe: Zahl oder Feld

Beispiel: Weißt der Variable Target den ersten Angreifer zu
Code: [Select]
Target = GetAttacker(1)
SetTarget(target)
Erklärung folgt Sobald ich verstanden habe wieder Befehl funktioniert.


FaceTarget(target)
Dreht sich zum Angreifer hin. Target sollte vorher mit "Target = GetAttacker(1)" ermittelt werden.


IsSpellReady(id)
Prüfft ob ein Spell verfügbar (Cooldown) ist. Es muss die SpellID angegeben werden.


SendKey(key)
Sendet einen Tastendruck an WoW. Die zu verwendete Taste muss in Anführungszeichen stehen. Besondere Tasten: Siehe Tipps und Tricks


_Log(msg)
Sendet eine Nachricht ans Logfenster von Crawlerbot. Die Nachricht muss in Anführungszeichen stehen.

Beispiel 1: Schreibt "Hallo Welt!" ins Logfenster
Code: [Select]
_Log("Hallo Welt!")Beispiel 2: Schreibt die Anzahl der Gegner ins Logfenster
Code: [Select]
_Log("Anzahl Gegner: ".. GetAttackerCount())
PlayerHpPercent()
Gibt die Höhe des Lebens in Prozent zurück. Rückgabe: Zahl


PlayerManaPercent()
Gibt die Höhe des Manas in Prozent zurück. Sollte auch mit Energie oder Fokus funktionieren. Rückgabe: Zahl


PlayerIsAutoAttacking()
Gibt zurück ob Automatischer Angriff aktiv ist


StartAutoAttack ()
Automatischer Angriff wird gewirkt. Achtung funktioniert nicht bei Mönchen!


LuaDoString()
Führt LUA Code in WoW aus. Man hat Zugriff auf die World of Warcraft API Funktionen.
(Link war falsch)
« Last Edit: October 28, 2012, 14:42:22 PM by seedlord »
Great Multi-Area herb&Mine Profile: SuperFarm 2.0
Awesome Fishing 1-600 with Coinmaster Achievment
--- NO SUPPORT VIA PM ---

September 27, 2012, 16:34:09 PM
Reply #3

riarry Offline

  • *
  • Posts: 1024
  • Reputation: 113
    • View Profile
Wie findet man SpellIDs heraus?

Wie in dem vorherigem Teil aufgefallen, werden überall SpellIDs verwendet. Eine SpellID identifiziert einen Zauber eindeutig und ist Sprachunabhänig. Das heißt die SpellID funktioniert in einer chinesischen WoW Version genau so wie in der englischen oder deutschen.

Am einfachsten Findet man die SpellID über die Webseite wowhead.com heraus. Die Seite erwartet Standardmäßig eine englischsprachige Eingabe, wenn man die Sprache aber auf Deutsch umstellt oder de.wowhead.com benutzt, dann kann man in das Suchfeld den gewünschten Spell eingeben.

Die SpellID fidnet man dann in der Adresszeile. Dort einfach nach "spell=XXXX" suchen und schon hat man die SpellID gefunden. Wenn ein Spell ein Buff ist, dann entspricht der Buff dem Spell, d.h. beide haben die gleiche ID.

Beispiel: SpellID von "Arkane Brillanz" in de.wowhead.com Suchfeld eingeben. Bei den Suchergebnissen zu den "Fähigkeiten" wechseln. Der Link dazu ist http://de.wowhead.com/spell=1459 also ist die SpellID 1459.

Die erste Custom Class
So jetzt haben wir alles wichtige um eine eigene Custom Class zu schreiben. Dazu erstellen wir im Ordner Custom Class einfach eine neue Datei und nennen sie test.lua. In diese Datei kopieren wir folgende Zeilen Code:

Code: [Select]
function Settings()
   FightDist = 15
   PullDist = 35
end
function NextAction()
   if true then return end
end

function Fight()
   Target = GetAttacker(1)
   Me = 0
end

In der Funktion Settings gibt es zwei Variablen einzustellen: die Distanz aus dem der Bot kämpfen soll und die Distanz ab der gepullt werden soll. In dieser Custom Class ist für ein Range-DD er kann ab 35m Distanz pullen und soll sich dem Mob auf 15m nähern können. Ein Melee muss natürlich niedrigere Werte haben. FightDist = 5 und PullDist = 5 sind gute Werte.

Die function NextAction() macht im Prinzip nichts, muss aber vorhanden sein und muss nach jedem Befehl benutzt werden, damit der Bot weiß, dass er die Custom Class weiter ausführen soll.

Alles was der Bot im Kampf machen soll muss in die Funktion fight() mit anschließendem "end". Zudem definieren wir noch zwei Variablen Target (siehe Botfuntktionen) und Me. Me ist optional, man kann ja auch um auf sich selbst zucasten auch eine 0 verwenden, allerdings ist die Verwendung von Me übersichtlicher.
Jetzt können alle Fähigkeiten und Bedingungen geschrieben werden.


Nun schreiben  wir uns als Beispiel eine neue Custom Class für Magier:

Beispiel 1: Wenn der Char den Spell "Feuerball" kennt, dann soll Feuerball auf das angreifende Ziel gewirkt werden. Der Bot soll warten bis der Cast vorbei ist.
Code: [Select]
if IsSpellKnown(133) then
   _Log("Cast Feuerball");
   CastSpellByID(133 , Target , true);
   NextAction();
end

Beispiel 2: Wenn der Char den Spell "Infernoschlag" kennt und der Cooldown frei ist, dann soll auf das angreifende Ziel Infernoschlag gewirkt werden. Da der Spell ein Sofortzauber ist soll der Bot nicht warten bis der Cast vorbei ist.
Code: [Select]
if IsSpellKnown(2136) and IsSpellReady(2136) then
   _Log("Cast Infernoschlag");
   CastSpellByID(2136 , Target , false);
   NextAction();
end

Beispiel 3: Wenn der Char Spell " Pyroschlag " kennt und den Buff "Pyroschlag!" erhält, also einen kostenlosen Instant Pyroschlag casten darf, dann soll er "Pyroschlag" auf das angreifende Ziel wirken. Da der Spell ein Spontanzauber ist soll der Bot nicht warten bis der Cast vorbei ist. Da Spontanzauber kein GCD auslöst kann man noch gleichzeitig die Volksfähigkeit "Kochendes Blut" auf sich selbst wirken, wenn der Spell bekannt ist und nicht auf Cooldown ist.
Code: [Select]
if HasBuff(48108) and IsSpellKnown(11366) then
   if IsSpellKnown(20572) and IsSpellReady(20572) then CastSpellByID(20572, Me , false)
   _Log("Pyro!");
   CastSpellByID(11366 , Target , false);
   NextAction();
end

Hier mal die komplette Custom Class:
Code: [Select]
function Settings()
   FightDist = 15
   PullDist = 35
end

function NextAction()
   if true then return end
end


function Fight()
   Target = GetAttacker(1)
   Me = 0

   if IsSpellKnown(133) and IsSpellKnown(133) then
      _Log("Cast Feuerball");
      CastSpellByID(133 , Target , true);
      NextAction();
   end

   if IsSpellKnown(2136) and IsSpellReady(2136) then
      _Log("Cast Infernoschlag");
      CastSpellByID(2136 , Target , false);
      NextAction();
   end

   if HasBuff(48108) and IsSpellKnown(11366) then
     if IsSpellKnown(20572) and IsSpellReady(20572) then CastSpellByID(11366 , Target , false)   
      _Log("Pyro!");
      CastSpellByID(11366 , Target , false);
      NextAction();
   end
end

Um die neue Custom Class zu testen muss man sie entweder in den (englischen) Klassennamen, in diesem Beispiel in" Mage.lua", umbenennen oder man öffnet die Datei Custom Class.ini und ändert einfach die Zuweisungen. Dann stellt man sich einfach neben einen Mob und startet den Bot.

Wichtig: Wenn man etwas an der CC ändert, dann der Bot komplett neu gestartet werden.
« Last Edit: October 19, 2012, 14:24:28 PM by riarry »
Great Multi-Area herb&Mine Profile: SuperFarm 2.0
Awesome Fishing 1-600 with Coinmaster Achievment
--- NO SUPPORT VIA PM ---

September 27, 2012, 16:34:28 PM
Reply #4

riarry Offline

  • *
  • Posts: 1024
  • Reputation: 113
    • View Profile
Tabelle: Keys


Key             Code
BACKSPACE       {BACKSPACE}, {BS}, or {BKSP}
BREAK           {BREAK}
CAPS LOCK       {CAPSLOCK}
DEL             {DELETE} or {DEL}
DOWN ARROW      {DOWN}
END             {END}
ENTER           {ENTER}
ESC             {ESC}
HELP            {HELP}
HOME            {HOME}
INS or INSERT   {INS}
LEFT ARROW      {LEFT}
NUM LOCK        {NUMLOCK}
PAGE DOWN         {PGDN}
PAGE UP         {PGUP}
PRINT SCREEN    {PRTSC}
RIGHT ARROW     {RIGHT}
SCROLL LOCK     {SCROLL}
TAB             {TAB}
UP ARROW        {UP}
F1             {F1}
...
F12             {F12}
Keypad add      {ADD}
Keypad subtract {SUBTRACT}
Keypad multiply {MULTIPLY}
Keypad divide   {DIVIDE}
@               {AT}
^               {CARET}
~               {TILDE}
{ }             {LEFTBRACE} {RIGHTBRACE}
( )             {LEFTPAREN} {RIGHTPAREN}
WINKEY          {WIN}


Tabelle: Deutsche und englischsprachige Klassennamen

Druide        Druid
Hexnemeister  Warlock
Jäger         Hunter
Krieger       Warrior
Magier        Mage
Mönch         Monk
Paladin       Paladin
Priester      Priest
Schamane      Shaman
Schurke       Rogue
Todesritter   DeathKnight
« Last Edit: September 28, 2012, 08:01:42 AM by riarry »
Great Multi-Area herb&Mine Profile: SuperFarm 2.0
Awesome Fishing 1-600 with Coinmaster Achievment
--- NO SUPPORT VIA PM ---

September 27, 2012, 17:30:18 PM
Reply #5

telcy Offline

  • *
  • *
  • Posts: 1695
  • Reputation: 182
    • View Profile

September 28, 2012, 08:04:41 AM
Reply #6

riarry Offline

  • *
  • Posts: 1024
  • Reputation: 113
    • View Profile
So, der Guide ist vorerst fertig, ich versuche ihn in Zukunft noch zu erweitern und aktuell zu halten.  Fragen und Anregungen gerne hier in den Thread schreiben.

- Mein Englisch ist nicht sonderlich gut, daher wird ein Übersetzer gesucht-
Great Multi-Area herb&Mine Profile: SuperFarm 2.0
Awesome Fishing 1-600 with Coinmaster Achievment
--- NO SUPPORT VIA PM ---

October 06, 2012, 16:24:30 PM
Reply #7

kampfschaf Offline

  • ****
  • Posts: 349
  • Reputation: 33
  • me gusta.
    • View Profile
Ich setz mich mal an die Übersetzung.
I'm back and slowly getting back into my projects

October 12, 2012, 03:45:12 AM
Reply #8

riarry Offline

  • *
  • Posts: 1024
  • Reputation: 113
    • View Profile
und wieder aktuell
« Last Edit: October 19, 2012, 14:25:21 PM by riarry »
Great Multi-Area herb&Mine Profile: SuperFarm 2.0
Awesome Fishing 1-600 with Coinmaster Achievment
--- NO SUPPORT VIA PM ---

January 04, 2013, 18:27:28 PM
Reply #9

cindy Offline

  • *
  • Posts: 21
  • Reputation: 0
    • View Profile
einige Fragen hätte ich da noch offen.

Gibt es eine möglichkeit einen Sleep einzubauen?
Cast Weihe
Sleep
Cast Heiliger Zorn
Sleep

etc?

Das halte ich bei einer CustomClass für den ProtPala z.B. für Sinnvoll. Da die komplette Rota sonst nicht vernünftig abgearbeitet wird.



2.: Gibt es eine möglichkeit herauszufinden wieviel Heilige Kraft eine Paladin besitzt? Die Kraft bei einer bestimmten Prozenzahl von HP einzusetzen ist nicht immer sinnvoll.

Gruß

G

January 04, 2013, 18:58:09 PM
Reply #10

Athermal Offline

  • *
  • *
  • Posts: 789
  • Reputation: 197
  • German Noob
    • View Profile
1. Ja
Code: [Select]
Sleep(500); in ms2. Ja
Code: [Select]
function GetHolyPower()
    LuaDoString('holypower = UnitPower("player", 9);')
    return tonumber(WowGetLuaValue('holypower'));
end
« Last Edit: January 04, 2013, 19:00:09 PM by Athermal »
You like it then give +rep for it

January 09, 2013, 12:59:34 PM
Reply #11

cindy Offline

  • *
  • Posts: 21
  • Reputation: 0
    • View Profile
perfekt, vielen Dank.

Jetzt fehlt mir noch ein bisschen die getTargetHP();

Da gibts doch sicher auch was oder?

Gruß
« Last Edit: January 09, 2013, 14:22:38 PM by cindy »

January 10, 2013, 12:45:47 PM
Reply #12

ruberduck Offline

  • *
  • Posts: 230
  • Reputation: 54
    • View Profile
Jupp.
Da gibt es was. ^^
Code: [Select]
function GetUnitHpPro(target_address)
    local target;
    if (target_address == Player) then
        target="player";
    else
        target="target";
    end

    WowLuaDoString('hp=100 * UnitHealth("' .. target .. '") / UnitHealthMax("' .. target .. '")');
    return tonumber(WowGetLuaValue("hp"));
end

LG
Ruberduck
If you like my work please make an .

January 11, 2013, 15:55:56 PM
Reply #13

KlausHansen Offline

  • *
  • Posts: 9
  • Reputation: 0
    • View Profile
Schreibe gerade an meiner Windwalker Custom Class, es läuft alles ganz gut, aber ich habe noch 2 Probleme:

1. Ich möchte Legacy of the Emperor buffen, allerdings bufft sich mein Toon jetzt jedes mal wenn er in combat geht und auch immer wenn die Rota einmal komplett durchgelaufen ist. Mein Code sieht folgendermaßen aus:

if not HasBuff(117667) then
      _Log("Cast Legacy of the Emperor");
      CastSpellByID(115921, Player, true);
      NextAction();
   end

Was ist daran falsch? Es ist praktisch der gleiche Code wie aus dem Tutorial.
   
2. Mein Monk ist noch im lowlevel Bereich, die Rota ist so angelegt, dass erzeugte Resourcen (Chi/Energie) immer sofort ausgegeben werden. Wenn ich allerdings eine Attacke verfehle/sie gedodget/parryt wird, bekomme ich keine Energie, aber er versucht trotzdem einen Stile auszuführen. Wie kann ich überprüfen ob die Attacke wirklich getroffen hat?


Danke schon mal im voraus. (:
« Last Edit: January 11, 2013, 16:03:07 PM by KlausHansen »

January 11, 2013, 15:59:57 PM
Reply #14

Athermal Offline

  • *
  • *
  • Posts: 789
  • Reputation: 197
  • German Noob
    • View Profile
versuch mal  not HasBuff(Player,117667)
You like it then give +rep for it

 

* Recent Topics

* Useful Stuff