Tutorial: Eigene Emotes in PetEmote

Willkommen beim Tutorial: Eigene Emotes in PetEmote. Diese Anleitung erklärt Schritt für Schritt, wie du eigene zufällige Emotes für deine Lieblingstierart oder sogar deinen speziellen, treuen Begleiter schreiben kannst.

Ein paar Worte über Tier-Emotes

Um hochwertige, zufällige Emotes schreiben zu können, musst du zuerst verstehen, wie PetEmote funktioniert. PetEmote benötigt keinen versteckten Chat-Channel, um seine Texte an andere Spieler senden zu können, sondern bedient sich einer Technik, die sich Maskieren nennt. Das heißt, was wirklich an andere Spieler geschickt wird, ist etwas wie SpielerName ‘s Tierart TierName kann feine Emotes machen. Es ist nichts anderes als ein einfaches, selbstgeschriebenes Emote, das jeder mit dem /me-Befehl schreiben kann. Und das ist der Trick: PetEmote erkennt alle Emotes, die es selbst oder andere Spieler mit PetEmote geschickt haben und schneidet den Teil vor dem Namen des Tieres einfach ab.

Aus diesem Grund werden alle Spieler, die PetEmote nicht installiert haben, immer die ungeschnittene Variante mit dem Namen des Spielers gefolgt von der Tierart lesen können. Natürlich gibt es da draußen weitaus mehr Spieler, die ohne PetEmote spielen. Deshalb solltest du immer daran denken, dass Tier-Emotes eigentlich mit dem Namen des Spielers beginnen – also benutze niemals deinen eigenen Namen in Tier-Emotes! Sonst lesen die meisten Spieler sowas wie das:

Jorna’s Bär Mad schnüffelt an Jorna’s Tasche nach etwas Futter.

Klingt das gut? Nein — also lass es. Wenn du wirklich innerhalb eines Tier-Emotes auf dich selbst verweisen musst, mache es aus der Sicht eines Dritten:

Jorna’s Bär Mad schnüffelt an der Tasche seines Frauchens nach etwas Futter.

Sehen wir uns jetzt einmal an, wie man zufällige Emotes konfiguriert.

Wie PetEmote zufällige Emotes erzeugt

Das Problem an automatisch generierten Emotes oder Textmeldungen ist immer das selbe: sie wiederholen sich nach einiger Zeit. Das Ziel von PetEmote ist es, Wiederholungen so gut es geht zu minimieren. Was ein Tier tun kann (beschrieben in einem Emote) wird natürlich nur durch die Fantasie der Spieler begrenzt. Dafür gibt es handgeschriebene Emotes. Dummerweise passen viele gute Emotes nicht in jeder Situation. Deshalb werden zufällige Emotes eigentlich dadurch eingeschränkt, dass sie versuchen, möglichst neutral zu bleiben.

PetEmote versucht, Abwechslung in seine Emotes zu bringen. Das wird dadurch erreicht, dass Emotes in kleine Stückchen Text zerlegt und dann zufällig zusammengebaut werden. Die einzelnen Textbausteine wollen gut gewählt sein, um schlechte Grammatik oder falschen Satzbau zu verhindern. Hinzu kommt, dass PetEmote einen, zwei oder sogar drei dieser zufälligen Sätze zu einem großen Satz zusammen baut, indem es sie mit einem Komma oder dem Wort und verbindet.

Das bietet uns den Charme vieler verschiedener Emotes, obwohl wir nur ein paar Wörter und regeln definiert haben. Natürlich ist die Wiederholung dadurch nicht völlig ausgeschlossen. Aber man bekommt das Gefühl, nie genau zu wissen, was das Tier als nächstes tun wird.

Wie Änderungen im Spiel wirksam werden

Wenn du irgendetwas an der Konfiguration geändert hast und die Datei speicherst, wird sich das nicht auf das laufende Spiel auswirken. Andererseits musst du das Spiel auch nicht neu starten oder dich neu einloggen. Mit dem Befehl /console reloadui wird das Interface neu geladen, was auch alle Addons einschließlich PetEmote betrifft. Alles was du geändert hast, wird dann funktionieren – sofern du keine Fehler gemacht hast.

Den PetEmote Editor verwenden

Du kannst zum Schreiben eigener Emotes den PetEmote Editor nutzen, den du im PetEmote Addon-Verzeichnis findest. Der Editor funktioniert nur unter Windows und benötigt das Microsoft .NET Framework 3.5. Solltest du das nicht installiert haben, wirst du beim Starten der Anwendung eine Fehlermeldung erhalten.

Der Editor nimmt dir die umständliche Arbeit im Quellcode ab. Du musst nur noch schreiben, speichern, Interface neu laden. Die nachfolgende Beschreibung bezieht sich ausschließlich auf das Schreiben von Emotes von Hand — ohne Editor. Trotzdem kann es nützlich sein, die Abschnitte zumindest zu überfliegen, damit du ein Gefühl für den Aufbau der Emotes bekommst. Der Editor baut auf diese Struktur auf.

Wo man eigene Emotes ablegt

In deinem PetEmote Installationsverzeichnis (das normalerweise /World of Warcraft/Interface/AddOns/PetEmote sein sollte) findest du eine Datei namens default-emotes.lua. Erstelle eine Kopie dieser Datei und nenne sie custom-emotes.lua. Öffne diese Datei mit einem besseren Texteditor – das heißt, benutze nicht den Windows-Editor oder Wordpad. Der Texteditor muss UTF-8 unterstützen, weil World of Warcraft alle Dateien in diesem Format erwartet. Ansonsten wirst du im Spiel eine Fehlermeldung bekommen, die in etwa besagt, dass alle Chatnachrichten im UTF-8-Format gesendet werden müssen. Wenn du nicht weißt, welchen Texteditor du nehmen sollst, versuch es mal mit Notepad++ (einfach die neueste Installationsdatei herunterladen). Du kannst den Inhalt der Datei nach einer Tierart durchsuchen und die Texte dort ändern — oder du löschst den gesamten Inhalt und beginnst mit einer leeren Konfiguration wie im Folgenden beschrieben.

Grundsätzlich beginnt und endet jede Konfiguration so:

PetEmote_DefaultEmotes["Tierart oder Tiername"] = {
    –– viele Zeilen Konfiguration
}

Der Teil in den eckigen Klammern definiert, wofür deine Konfiguration ist. PetEmote bringt standardmäßig für die meisten Tierarten eine einfache Konfiguration mit, aber du kannst jede beliebige Tierart in custom-emotes.lua überschreiben. Du kannst außerdem den Namen eines deiner Tiere dort einfügen, damit PetEmote diese Konfiguration ausschließlich für dieses Tier nutzt (bzw. für alle Tiere mit diesem Namen, aber das ist dein Problem, wenn du alle deine Tiere gleich nennst).

Du kannst statt PetEmote_DefaultEmotes ebenfalls einen Abschnitt mit der Bezeichnung PetEmote_CombatEmotes anlegen, in den du alle Emotes einträgst, die dein Tier während eines Kampfes von sich geben kann. Für diese Emotes gelten die gleichen Regeln wie für die Standard-Emotes. Genauso funktioniert das für die Tiere der Jäger mit PetEmote_FeedingEmotes.

Emotes definieren

Jetzt kommen wir zur eigentlichen Arbeit: Emotes für dein Tier definieren. Wenn du keine Ahnung von LUA hast, halte dich nah am Beispiel-Code und achte darauf, dass du die eckigen und geschweiften Klammern und Kommata richtig setzt.

PetEmote_DefaultEmotes["MeinTier"] = {
    [1] = {
        ["text"] = "macht etwas lustiges",
    },

}

Das definiert ein Emote, das so aussehen wird: MeinTier macht etwas lustiges. Rücke deinen Code mit Tabulatoren ein – einer mehr für jede Ebene, die du tiefer in den Konfigurations-Baum vorrückst. Das macht es erheblich einfacher, zu verstehen, was du da tust.

Die Zahl 1 ist der Index des Emotes. Jedes Emote hat seine eigene einzigartige Nummer; dieser Nummern müssen aufeinander folgen. So gesehen sind Emotes nichts anderes als fortlaufend nummerierte Einträge in einer Liste.

Dir ist sicher der Teil ["text"] nicht entgangen. Das ist der Schlüssel, der den Emote-Text festlegt. Mal sehen, welche anderen Schlüssel es noch gibt.

Zusätzlicher Text

[1] = {
    ["text"] = "macht etwas lustiges",
        ["optional"] = {
        [1] = {
            ["text"] = "mit den Ohren",
        },
        [2] = {
            ["text"] = "mit den Füßen",
        },
    },

},

Der optional-Schlüssel definiert eine Untergruppe möglicher Emotes, also eine Art Zusatz, der seinem übergeordneten Emote folgen kann. PetEmote muss diese zusätzlichen Emotes nicht unbedingt verwenden, also achte darauf, dass das übergeordnete Emote für sich alleine auch einen Sinn ergibt. Jetzt kann unsere Konfiguration die folgenden Emotes ausgeben:

Fortsetzungs-Text

[1] = {
    ["text"] = "macht etwas lustiges",
    ["optional"] = {
        [1] = {
            ["text"] = "mit den Ohren",
        },
        [2] = {
            ["text"] = "mit den Füßen",
        },
    },
},
[2] = {
    ["text"] = "führt einige",
    ["continues"] = {
        [1] = {
            ["text"] = "andere Sachen vor",
        },
        [2] = {
            ["text"] = "lustige Tricks vor",
        },
    },
},

Der continues-Schlüssel (fortsetzen) ist dem optional-Schlüssel sehr ähnlich, mit einem wesentlichen Unterschied: einer der Texte, die darunter definiert werden, muss dem übergeordneten Text hinzugefügt werden. Aus diesem Grund führt dieser Teil der Konfiguration nur zu zwei neuen Emotes:

Weil wir den continues-Schlüssel benutzt haben, kann die Konfiguration nicht den Text MeinTier führt einige. ausgeben.

Ein kleiner Hinweis am Rande: Es ist möglich, die optional- und continues-Schlüssel nebeneinander innerhalb des selben Elements zu nutzen. PetEmote wird entscheiden, ob es den optionalen Teil ausführen will, und anderenfalls garantiert den continues-Weg einschlagen.

Folge-Emotes verbieten

Um eine größere Auswahl verschiedener Emotes zu produzieren, kann PetEmote mehrere Emotes der obersten Ebene miteinander verbinden. Grundsätzlich kann PetEmote jedes beliebige Emote mit jedem anderen verbinden. Das kann unter Umständen zu ziemlich schlechten Formulierungen führen, zum Beispiel wenn ein Wort in beiden Teilen des Emotes vorkommt. Um das zu verhindern, solltest du jedem Emote eine Liste der wichtigsten Wörter des Satzes zur Verfügung stellen. PetEmote wird keine Textabschnitte miteinander kombinieren, in denen eines dieser Schlüsselworte gleich ist.  Mit einem Beispiel sollte es verständlicher werden:

[1] = {
    ["text"] = "macht etwas lustiges",
    ["optional"] = {
        [1] = {
            ["text"] = "mit den Ohren",
            ["keywords"] = { "Ohren", "Ohr" },
        },
        [2] = {
            ["text"] = "mit den Füßen",
        },
    },
},
[2] = {
    ["text"] = "wackelt",
    ["continues"] = {
        [1] = {
            ["text"] = "mit dem Schwanz",
        },
        [2] = {
            ["text"] = "mit den Ohren",
            ["keywords"] = { "Ohren", "Ohr" },
        },
    },
},

Das Schlüsselwort Ohren teilt PetEmote mit, dass dieses Emote mit keinem anderen Emote kombiniert werden darf, das ebenfalls dieses Schlüsselwort besitzt. Gleiches gilt für das Wort Ohr. Umgekehrt funktioniert es genauso.

Du kannst außerdem sehr leicht verhindern, dass ein Emote mit einem anderen verbunden wird, indem du am Ende des Textes einen Punkt, ein Ausrufezeichen oder ein Fragezeichen setzt. PetEmote wird nach diesen Satzzeichen garantiert keine weiteren Texte mehr anfügen.

Bedingungen

Früher oder später wirst du die Idee für ein Emote haben, das mit den oben genannten Mitteln nicht einfach so umgesetzt werden kann. In einer Konfiguration für eine Tierart kannst du zum Beispiel nicht auf den “Meister” des Tieres verweisen, weil du nicht weißt, ob dieser einen männlichen oder weiblichen Charakter spielt. Das Geschlecht des Tieres kann ebenfalls in bestimmten Satzteilen wichtig sein. Für viele Emotes kann es auch interessant sein, das aktuelle Ziel des Spielers abzufragen und zu wissen, ob es freundlich oder feindlich gesinnt ist. Schauen wir mal, was wir da tun können:

[1] = {
    ["text"] = "knurrt %t",
    ["condition"] = TargetExists,
    ["continues"] = {
        [1] = {
            ["text"] = "grimmig an",
            ["condition"] = TargetIsUnfriendly,
        },
        [2] = {
            ["text"] = "freundlich an",
            ["condition"] = TargetIsFriendly,
        },
        [3] = {
            ["text"] = "laut an",
        },
    },
},

Der condition-Schlüssel (Bedingung) legt ein Schlüsselwort fest, das PetEmote anweist, zu überprüfen, ob die Bedingung erfüllt wird und ihm dann erlaubt, diesen Teil des Emotes zu nutzen. In diesem Beispiel wird das Tier das Ziel also nur anknurren, wenn es überhaupt ein Ziel gibt (TargetExists) – diese Abfrage ist also recht sinnvoll, wenn man mal an seinen ersten Einsatz von %t zurück denkt, bei dem man gerade kein Ziel hatte.

Das Emote im Beispiel bietet drei Möglichkeiten: grimmig, freundlich oder laut knurren. Das Erste kann nur passieren, wenn das Ziel unfreundlich ist, das Zweite nur, wenn das Ziel freundlich ist und das Dritte in beiden Fällen. Es ist wichtig, sich genau zu überlegen, welche Möglichkeiten PetEmote offen stehen und für jeden Fall mindestens eine anzubieten. Wenn nur verschiedene Möglichkeiten für unfreundliche Ziele definiert wurden, wird PetEmote einen Fehler produzieren, sobald das Emote bei einem freundlichen Ziel zum Einsatz kommt.

Im nächsten Beispiel fragen wir das Geschlecht von Tier und Spieler ab. Auch hier werden beide Möglichkeiten definiert, aber es kann darauf verzichtet werden, eine neutrale Möglichkeit zu bieten, weil es nicht viel mehr als männlich und weiblich gibt – eines davon wird in jedem Fall zutreffen.

[2] = {
    ["text"] = "schnüffelt an der Tasche",
    ["continues"] = {
        [1] = {
            ["text"] = "seines",
            ["condition"] = PetIsMale,
            ["continues"] = {
                [1] = {
                    ["text"] = "Herrchens",
                    ["condition"] = PlayerIsMale,
                },
                [2] = {
                    ["text"] = "Frauchens",
                    ["condition"] = PlayerIsFemale,
                },
            },
        },
        [2] = {
            ["text"] = "ihres",
            ["condition"] = PetIsFemale,
            ["continues"] = {
                [1] = {
                    ["text"] = "Herrchens",
                    ["condition"] = PlayerIsMale,
                },
                [2] = {
                    ["text"] = "Frauchens",
                    ["condition"] = PlayerIsFemale,
                },
            },
        },
    },
},

Es folgt eine Liste aller möglichen Bedingungen, bezogen auf die jeweils aktuellste Version von PetEmote.

Bedingungen zur Zufriedenheit

Die Begleiter von Hexenmeistern sind immer unzufrieden, zufrieden und glücklich zur selben Zeit; besser gesagt, es gibt keine Zufriedenheit. Diese Bedingungen für diese Begleiter zu nutzen, wird keinen Unterschied machen. Wenn du dir die Standard-Konfigurationen in der Datei default-emotes.lua ansiehst, wirst du feststellen, dass alle Jäger-Tiere häufig Zufriedenheits-Bedingungen nutzen, besonders auf der obersten Ebene.

Bedingungen zum Ziel

Alle Ziel-Bedingungen ignorieren sowohl den Spieler als auch das Tier selbst. Das heißt, wenn der Spieler sich selbst oder sein Tier im Ziel hat, ist das für PetEmote so, als hätte er kein Ziel. Diese Ausnahme ist dazu gedacht, sicherzustellen, dass am Ende gute Emotes herauskommen, wie am Anfang dieses Tutorials erklärt wurde.

Bedingungen zum Geschlecht

Bedingungen zum Futter

Diese Bedingungen haben nur Auswirkungen auf die Tiere von Jägern und auf Emotes, die in einem Abschnitt PetEmote_FeedingEmotes definiert werden.

Bedingungen zum Satzbau

Diese Bedingungen, besonders die erste, können nützlich sein, wenn du sicherstellen willst, dass ein Text garantiert nur an einer bestimmten Stelle eines Emotes verwendet wird, zum Beispiel an der ersten.

PetEmote verbessern

Wie man sieht, grenzt es fast schon an Arbeit, PetEmote zu sagen, was es zu tun hat. Eine gute Konfiguration für nur eine Tierart kann schnell in mehrere hundert Zeilen Code ausarten. Deshalb ist es für mich als einzigen Entwickler nicht möglich, das alles allein zu schreiben – zumal wohl auch niemand mit allen Tierarten regelmäßig spielt und somit auch niemand weiß, was andere Spieler an ihren Emotes vermissen.

Wenn ihr Fragen zur Konfiguration von PetEmote habt oder Vorschläge für neue Bedingungen und andere Sachen machen wollt, mailt mir einfach: jorna@zirkel-des-cenarius.eu (aber bitte fragt mich nicht, wie man das Addon installiert, warum es nicht funktioniert und warum es über irgendwelche Syntaxfehler heult, die ihr reingemacht habt). Außerdem freue ich mich, wenn ihr mir eure Konfigurationen schickt – ich werde sie gerne mit in die nächste Version von PetEmote übernehmen, um die Standard-Konfiguration besser und nützlicher zu machen. Vielen Dank im Voraus!