blog.skyfighter.net
world of warcraft blog

Armory + PHP - Teil 1: XML einlesen, Onlinestatus, einfache Ausgabe

04.04.2008 von Jan

Die Informationsvielfalt im Armory ist recht gigantisch und wird auch grafisch hochwertig präsentiert. Leider fehlt jegliche direkte Entwicklerschnittstelle und nicht jeder kann sich mit derart übertriebenen Darstellungen anfreunden. Der Vorteil im Armory liegt in seinem Datenhintergrund. Es generiert sich aus XML-Dateien, welche mit relativ wenig Mühe in PHP eingelesen werden können.

Der UserAgent und das Täuschungsmanöver

Blizzard rückt seine Daten nicht sofort heraus, sondern man muss die Scriptabfrage als Benutzeranfrage verschleiern um die XML-Datei im Hintergrund laden zu können. In PHP wird die ini-Funktion “user_agent” dafür verwendet und die Ausgabe nach UTF-8 formatiert.

# UserAgent setzen
$useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.6)
Gecko/20040206 Firefox/1.0.1";
ini_set('user_agent',$useragent);
header('Content-Type: text/html; charset=utf-8');
 

XML-Datei einlesen

Der nächste Schritt besteht darin, die Daten der XML-Datei erstmal als Variable in die PHP-Andwendung zu bekommen, bevor wir irgendwelche Algorithmen zur Auswertung starten können.
Innerhalb meiner Armory Klasse habe ich mich für eine Variante mit CURL entschieden. Dies setzt die libcurl voraus. Der Useragent wird auch hier bei der Anfrage übergeben. Ein einfacher Weg ist auch die XML-Datei mittels file_get_contents() in eine Stringvariable zu laden.

# URL vorbereiten
$URL
= "http://eu.wowarmory.com/character-sheet.xml?r=Echsenkessel&n=Ariliao";

# CURL initialisieren und XML-Datei laden
$curl = curl_init();

curl_setopt ($curl, CURLOPT_URL, $URL);
curl_setopt($curl, CURLOPT_USERAGENT, $useragent);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$load = curl_exec($curl);
curl_close($curl);

Armory online oder offline?

Aufgrund der extrem starken Auslastungen kann es vorkommen, dass das Armory nicht erreichbar ist. Meist wird eine Standardnachricht angezeigt und man erhält keinen Einblick auf Daten.

Nach einiger Tüftelei kann die Länge des eingelesenen Strings (im Onlinefall die XML-Datei) dazu benutzt werden einen Status relativ zielsicher zu ermitteln. Die Übersicht eines Charakters ist bis zu 15.000 Zeichen lang und im Gegensatz zur Fehlermeldung wesentlich größer. Eine Überprüfung auf 5000 Zeichen Mindestlänge kann einige Probleme lösen. Wird keine Onlineabfrage durchgeführt, erhält man im Offlinefall nur wirre Datenausgaben bzw. Fehlermeldungen. Kein Benutzer des Scripts sieht so etwas gern.

# Laenge des eingelesenen Strings ermitteln
$sleng = strlen($load);

# Pruefen ob online / offline mittels Laenge
if($sleng >= 5000) {

     # Armory online => Datenverarbeitung beginnen
}
else {

     # Armory offline => Fehlermeldung anzeigen
}

XML-Daten nutzen => SimpleXML

PHP liefert die Möglichkeit XML-Dateien mit SimpleXML zu verarbeiten. Dabei wird der eingelesene String zu verwaltbaren XML-Elementen welche im Programmcode genutzt werden können.

# eingelesenen String zu SimpleXMLElement umformen
$xml = new SimpleXMLElement($load);

XML-Struktur und der Zugriff auf Felder und Attribute

Eine weitere Hürde für die Nutzung der Armorydaten ist die Struktur, welche im momentanen Programmcode vorliegt. Die Variable $xml enthält alle verfügbaren Charakterdaten und müssen nur noch verarbeitet werden. Eine größere Liste über die Objekte und die Form des XML-Objekts wird es in einem späteren Teil geben.

Für die momentane Ausgabe, soll nur der Name und das Level eines Charakters per echo verkündet werden. Beides befindet sich unter $xml->characterInfo->character mit dem Attribut ‘name’ bzw. ‘level’.

# Namen und Level des eingelesenen Charakters ausgeben

echo $xml->characterInfo->character['name']." hat das
Level ".$xml->characterInfo->character['level'];

Probleme bei der Zuweisung in Variablen / Arrays

Die Variable $xml enthält Objekte und bei diesen kann es innerhalb von PHP zu Problemen kommen, wenn man sie einfach in neue Arrays sortieren möchte.
Ein kleiner und sicher nicht sehr eleganter Workaround ist die Zuweisung als Ergänzung zum String im Array. Bei einer Neuzuweisung ist das Ergebnis dieser ‘Ergänzung’ gleich der normalen Zuweisung, da neue Arrayfelder immer Leer sind.

# Charakternamen in neues Array bringen: ' .= ' ist die Ergaenzung

$Char["Info"]["name"] .= $xml->characterInfo->character['name'];

Der gesamte Quellcode des Beispiels

# UserAgent setzen
$useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; de-DE; rv:1.6)
Gecko/20040206 Firefox/1.0.1";
ini_set('user_agent',$useragent);
header('Content-Type: text/html; charset=utf-8');

# URL vorbereiten
$URL
= "http://eu.wowarmory.com/character-sheet.xml?r=Echsenkessel&n=Ariliao";

# CURL initialisieren und XML-Datei laden
$curl = curl_init();

curl_setopt ($curl, CURLOPT_URL, $URL);
curl_setopt($curl, CURLOPT_USERAGENT, $useragent);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$load = curl_exec($curl);

echo $load;
curl_close($curl);

# eingelesenen String zu SimpleXMLElement umformen
$xml = new SimpleXMLElement($load);

# Namen und Level des eingelesenen Charakters ausgeben

echo $xml->characterInfo->character['name']." hat das
Level ".$xml->characterInfo->character['level'];

Wird es noch mehr Entwicklerinfos zum Armory von dir geben?

Ja wird es. Ich plane eine Übersicht über die Datenstrukturen als Hilfe für mich wie für andere Entwickler zu veröffentlichen. Eventuell kann ich sogar Teile meiner Armory Klasse, welche auf wow.skyfighter.net zum Einsatz kommt zur Verfügung stellen.

Abgelegt in WoW/Programmierung | 19 Kommentare »

Tägliche Angelquests - Fischt bis ihr zum Fisch werdet!

28.03.2008 von Jan

Herrlich! Endlich gibt es einen Grund zu Fischen und nebenbei etwas abzustauben. Eine weitere Übersicht, damit ich nicht ständig bei WoWHead nachschlagen muss und anderen vielleicht auch einen Gefallen tue: Tägliche Angelquests vom alten Barlo am See nordöstlich von Shattrath.

Bitte verzeiht, dass ich einige Questnahmen recht frei übersetzt habe. Buffed und Speedydragon sind nicht sehr aktuell für diese Quest und WoWHead bietet nichts in Deutsch.

Krokilisken in der Stadt

Die einfachste Quest der 4 Möglichkeiten. Ihr sollt ein [Krokiliskenbaby] in der Hauptstadt angeln. Dazu bewegt ihr euch noch Stormwind oder Orgrimmar und fischt in den Gewässern der Stadt. Die Dropraten sind recht gut, sodass ihr nicht sehr lange angeln müsst. Ebenso ist kein besonderer Angelskill vorausgesetzt, Skill 1 für alle Hauptstädte eben.

Abgegeben wird die Quest wieder beim alten Barlo in der Nähe von Shattrath.

Köderbanditen

Euer Ziel ist der [Schwarzer Stachelflosser]! In dieser Quest liegt das erste Missverständnis, welches viele Angler begehen. Wer den Questtext gelesen hat, erfährt das dieser Fisch nur in Fließgewässern vorkommen kann. Jeder der seine Angel in den See bei Barlo wirft ist falsch. Geht zu den Flüssen in den Wäldern von Terokkar und angelt. Ebenso ist es falsch, dass ihr besonders lange nach der Köderbewegung bis zum Einholen warten müsst. Normales Fischen wie an jeder anderen Stelle ist genauso möglich und schnell.

Der Eine der entwischte

Einer der größten Fische ist entwischt, namentlich der [Größter Matschflosser der Welt]. Ihr sollt ihn fangen und zurück zu Barlo bringen. Für diese Quest reist ihr nach Nagrand und angelt an den Seen. Dabei nicht unbedingt große Wege gehen oder Matschflossenschwärme suchen. Dieser Fisch kann in allen Seen geangelt werden und hat eine akzeptable Dropchance. Beachtet dabei, dass ihr einen recht hohen Angelskill und möglicherweise Köder braucht um überhaupt in Nagrand angeln zu können.

“Shrimpin’ Ain’t Easy”

10 [Riesige Süßwassergarnele] müssen gefangen werden. Diese können nicht direkt gefischt werden, sondern sind in [Stachelkiemenforelle] enthalten. Letzere findet ihr in allen Gewässern in den Zangamarschen. Ich selbst bevorzuge sie an der markierten Stelle zu angeln. Wozu weit bewegen, wenn man länger fischen könnte! Die Dropraten der Forellen sind gut und auch die Shrimps bekommt beißen fein an die Angel. Wieder müsst ihr euren Angelskill beachten und gegebenenfalls Köder verwenden.

Ja und was was hab ich davon?!

Nach dem Abschließen der Quest erhaltet ihr einen [Sack voll geangelter Schätze]. In jedem Fall sind 6 bis 7 Gold und anderer Kleinkram zu finden. Ein lustiges Elixier zum übers Wasser laufen. Köder in Form einer Angelschnur. “Getränke” und Hüte aber auch “Surprises”. Auf den Seiten von WoWHead findet ihr in den Kommentaren eine schöne Auflistung. Lohnen tut es sich und Angeln ist doch was feines! ;)

Abgelegt in Quest | 4 Kommentare »

Angeln&Kochen - Leckeres Essen #1 - Angelfood

25.03.2008 von Jan

Ob es nun akute Langeweile oder einfach die Begeisterung am Bufffood ist - ich weiß es nicht. Jedenfalls habe ich mit Ariliao sowohl meinen Koch- als auch den Angelskill binnen weniger Tage auf 375 gebracht. Angeln durch Zeitopferung in einem rasenden Tempo und Kochen an einem Tag hinterher im Eilverfahren per Guide.

Als Gedankenstütze für mich und Auflistung für Andere, möchte ich eine kleine Übersicht zusammenstellen.

Angel + Kochen in WoW

Angelfood

[Würziger Flusskrebs]

  • Effekt: 30 Ausdauer & 20 Willenskraft
  • Rezept: Käuflich in Terokkar
  • Materialien: [Grimmiger Flusskrebs]
  • Geangelt in: Wälder von Terokkar (Skettis), Mischschwärme

[Goldfischstäbchen]

  • Effekt: 44 erhöhte Heilzauber & 20 Willenskraft
  • Rezept: Käuflich in Terokkar
  • Materialien: [Goldener Stachelflosser]
  • Geangelt in: Wälder von Terokkar (Skettis), 3 große Seen in Terokkar

[Schädelfischsuppe]

  • Effekt: 20 kritische Zaubertrefferwertung & Willenskraft
  • Rezept: Tägliche Angelquest (Fass mit Fischen)
  • Materialien: [Mondschädelfisch]
  • Geangelt in: Gewässer für Karazahn, Seen in Zul’Aman

[Fischerschmaus]

[Gedünstete Blauflosse]

  • Effekt: 23 Zauberschaden & 20 Willenskraft
  • Rezept: Nagrand Kochbedarf
  • Materialien: [Eisblauflosse]
  • Geangelt in: Nagrand Seen, Spots im Westlichen

[Gegrillter Matschflosser]

  • Effekt: 20 Beweglichkeit & Willenskraft
  • Rezept: Nagrand Kochbedarf
  • Materialien: [Feigenschimmers Matschflosser]
  • Geangelt in: Nagrand Gewässer aller Art

[Schwarzgebratener Sporenfisch]

  • Effekt: 20 Ausdauer & 8 Mana alle 5 Sekunden
  • Rezept: Angelbedarf Zangamarschen
  • Materialien: [Zangarischer Sporenfisch]
  • Geangelt in: Zangamarschen (auch Spots)

Angel + Kochen in WoW

Ab Angelskill 300-305 (+100er Köder [Aquadynamischer Fischablocker]) könnt ihr gemütlich in den Zangamarschen anfangen zu Angel. Ab 330 lohnen sich die unteren Seen in Terokkar und ab 350 Skettis und die oberen Gebiete.

> Bufffood aus Fleisch und Allerlei gibt es bald in der Übersicht <

Abgelegt in Ariliao, Wiese | 1 Kommentar »

Trolljagd für Fortgeschrittene

23.03.2008 von Jan

Ein klein wenig vom Gildengeschehen möchte ich jetzt berichten bzw. wenigstens Screenshots der letzten Erfolge vom gestrigen Abend/Nacht präsentieren.

Unsere elegante Gruppe machte sich auf nach Zul’Aman und legte zuerst Jan’alai. Nach vielen, und abervielen Versuchen konnten wir die “Eierfrage” passenderweise kurz vor Ostern klären.

Fröhlich und voller Elan schauten wir uns den Hexlord Malacrass an und stellten im ersten Versuch bei 40% fest, dass wir ihn schaffen können. Dennoch hielt er uns einige Trys auf Trapp. Seine Paladinfähigkeiten sind ziemlich hart und auch die Geistesblitze machten uns Heilern Probleme. Gegen halb 2 Uhr nachts lag er dann vor uns und wir konnten 2 Gildenfirstkills an einem Abend verbuchen.

Zul’jin wir kommen!

Abgelegt in Ariliao, Instanzen & Raids | Keine Kommentare »

« Vorherige Einträge