Warum ich nicht antworte

March 30th, 2010 by Sirius_White

Es soll Situationen geben, in denen man mich nicht erreicht. In jüngster Zeit höre ich immer öfter von Betroffenen, dass sie mich im MSN und ICQ angeschrieben hätten, ohne eine Antwort zu bekommen. Sogar über Skype angerufen haben sie – und trotzdem kam keine Antwort! Seltsam…
Gehen wir das Problem einmal ganz simpel an: Um auf Textnachrichten erfolgreich zu antworten, müssen folgende Bedingungen erfüllt sein:

  • Die eingehende Nachricht muss bei meinem Messenger ankommen
  • Ich muss dies realisieren
  • Ich muss mich dazu entscheiden, darauf zu reagieren
  • Die Antwort muss ihren Weg zurück finden

Den ersten und letzten Punkt können wir in Zeiten des TCP Protokolls vernachlässigen. Wenn mein Rechner ACK sagt, dann ist ACK. FIN.

1. Realisierung der eingehenden Nachricht
Problemquelle: Ich bin nicht immer am Rechner!
Mein Rechner ist in der Regel durchgehend online. Dies hat den simplen Grund, dass er seit einiger Zeit den alten Linux Fileserver abgelöst hat und somit als Storage für dem gesamten Haushalt dient – welcher nicht nur aus mir besteht. Manchmal mache ich MSN und ICQ aus, aber normalerweise bleiben beide Programme einfach geöffnet und empfangsbereit. Heißt: Wenn ich im MSN online bin, heißt das noch lange nicht, dass ich auch wirklich online und anwesend bin. Wenn ich wieder da bin, werde ich wichtige Nachrichten schon beantworten:

2. Reaktion auf eigehende Nachricht
Problemquelle: Ich bin nicht gewillt, auf jede Nachricht sofort zu antworten.
Wer mich im MSN oder ICQ finden will, der wird dies recht schnell schaffen. Wer einen Grund hat mit mir zu reden, darf und soll das bitte auch tun.
Die meisten Leute kontaktieren mich aufgrund von eAthena oder RO-Client bezüglichen Fragen. Sofern es mir möglich ist helfe ich gerne bei Problemen, die man nicht binnen 5 Minuten im eAthena Forum lösen kann. Aber wenn jemand bei den einfachsten Dingen scheitert habe ich auf Dauer auch keine Lust, immer wieder beim Urschleim anzufangen. Wer das nicht akzeptiert, wird auch keine Antwort bekommen.

Doch die wohl beliebteste Methode, keine Antwort zu erhalten: Alle 10 Minuten nachfragen.
Niemand leistet hauptberuflich MSN Support für ein GPL Projekt. Und dementsprechend kann auch niemand gezwungen werden, irgendjemandem zu antworten. Es ist nicht die feine englische Art, aber wenn jemand nicht akzeptieren will, dass man gerade keine Zeit oder Lust hat, sich mit etwas zu beschäftigen, dann muss er damit leben, ignoriert zu werden.
Mittlerweile ist diese Community an einem Zustand angelangt, an dem man öffentlich nichts mehr in Aussicht stellen darf. Denn es endet zwangsläufig darin, dass man die Hälfte seiner Zeit damit beschäftigt ist, irgendwelchen Leuten klar zu machen, dass man sich nicht 24 Stunden am Tag mit ihren Problemen befassen kann und möchte.
Je penetranter man versucht eine Antwort zu bekommen, desto höher ist die Wahrscheinlichkeit im Endeffekt auf der Blockliste zu landen oder einen Blogpost wie diesen zu provozieren und danach auf der Blockliste zu landen. Im Endeffekt hat niemand gewonnen und jeder ein wenig zu viele Nerven verloren.

Was diesen Blogpost inspiriert hat? Folgende Unterhaltung “mit” einem Mitglied der deutschen eAthena Szene. Wenn ich nach Hause komme und einen derartigen Spamblock sehe, werde ich ganz bestimmt nicht mehr antworten:

[18:21] huhu
[19:05] biste nun da?
[19:05] oder noch nicht
[19:47] und wer da?
[20:18] da?
[20:48] da?
[21:26] biste nun da?
[21:52] da?
[22:25] da?
[22:57] da?’
[23:01] keiner schade =(
[23:08] wo isser denn eingepennt
[23:18] meld dich bitte egal wie spät wir haben echt nen problem und muss das dringend lösne
[23:53] ich hoffe du kommst heute nich >.<
[23:53] noch
[00:17] da?
[00:42] nun da?
[01:00] jetzt da?
[01:19] da?
[11:24] huhu
[12:30] nun jemand da?
[22:25] huhu
[22:26] da?
[01:43] huhu
[10:49] huhu
[10:53] jemand da?
[12:12] huhu
[12:16] hallii
[20:10] huhu
[22:44] huhu
[23:12] da?
[00:29] da?

Party plzzzz!

March 26th, 2010 by LightFighter

… oder: “Verschwinde aus meinem Kopf, Gravity!”

Ich bin fast aus allen Wolken gefallen, als Yommy (yomanda) mir folgenden Link über Gravitys neues Party Booking & Recruiting System präsentierte: Click meh.

Meine Antwort war folgende:

DAMNIT

I WANTED TO DO THAT

FUCK YOU GRAVITY

Bedarf wahrscheinlich keiner Übersetzung. Der Grund für meinen leicht ausfallenden Ton war, dass ich seit mehreren Wochen und Monaten die Idee gehegt hatte, irgendwann ein solches System mit Harmony zu realisieren. Das Timing von Gravity ist natürlich perfekt, denn Harmony ist gerade jetzt in einem Stadium, in dem ich durchaus hätte anfangen können, die ersten Windows zu entwerfen und das Backend zu programmieren. Aber nein, Gravity war mal wieder schneller! Aber mir macht das natürlich nichts aus, ich bin ja ein friedliches, und zartbesaitetes Wesen …..

Ich habe mich dann die letzten Tage daran gemacht, das System mal auseinander zu nehmen – was erstmal gar nicht so einfach war, da sich bisher noch niemand bequemt hat, das Interface zu übersetzen. Also mal schnell die aktuelle msgstringtable generiert, Google Translate drüber gejagt und nachgebessert. Nach getaner Arbeite öffne ich also meinen Client und freue mich auf ein nicht-koreanisches Booking Interface und – werde bitter enttäuscht. Es wurden vielleicht 2 oder 3 “Stringlein” genutzt, der Rest war wie vorher. Super.

Ein kurzer Blick in den ASM Code lässt böses erahnen: Es reicht Gravity anscheinend nicht, mir meine Idee zu klauen – nein! Irgendein Gravity Praktikant hat es anscheinend als unheimlich witzig empfunden, 90% der benutzten Strings hardcoded im Client zu verankern. Sicher, natürlich. Nachdem ich dann alle Strings per Hand im Hexeditor gesucht und übersetzt hatte, konnte ich dann tatsächlich mit einem englischen Booking Interface arbeiten. Bis auf ein paar Schönheitsfehler machte das Interface erstmal einen gar nicht mal so schlechten Eindruck:

Als ich dann anfing, die Packets zusammenzusuchen und zu analysieren, ist mir das wahrscheinlich beste Feature des ganzen Systems in die Hände gefallen: Die LSD Videos! Diese “Videos”, eher Foto Slideshows, bekommt man zu sehen, sobald man ein Party Recruit aufmacht, und auf antworten wartet. Sechs verschiedene Slideshows zum Thema Party, die wirklich nur in Verbindung mit Lysergsäurediethylamid entstanden sein können – herrlich!

Mein anfängliches Packet-Abenteuer ist dann im Laufe des Tages ausgeartet und schließlich haben White und ich alle möglichen neuen RE Packets im Client auseinander genommen und dokumentiert, die eAthena noch nicht unterstützt und haben sie dann im eA Forum gepostet. Sind ein paar wirklich interessante – und auch kuriose – Packets dabei gewesen, aber hat definitiv viel Spaß gemacht :)

Ach, und ja, ich blogge hier jetzt neuerdings mit :P

See ya,

Lighty

Unde venis?

March 22nd, 2010 by Sirius_White

Modulare Programme haben in der Regel zentrale Loggingfunktionen. Nun lässt sich zwar alles wunderschon loggen, doch die wichtigste Information fehlt in der Regel – welches Plugin hat diesen Logeintrag erzeugt?

Ich bin auf die Problematik gestoßen, als mich Timo gefragt hat, wie man herausfinden könnte, von welcher DLL ein Call kommt. Da ich zu dem Zeitpunkt selber gerade dabei war, die Modulfunktionen von Harmony zu entwerfen, habe ich mir darüber ein wenig Gedanken gemacht.

Man kann man natürlich den Log Aufruf mit einem weiteren Parameter ausstatten, um den Pluginnamen anzugeben. Simpel und funktioniert natürlich auch. Aber es geht noch eleganter!

Einige Theorie vorweg:
Um herauszufinden von welcher Dll ein Call kommt benötigt man die Speicheradresse, von der der Aufruf kommt. Wenn man dann noch eine Liste aller geladenen Module hat, lässt sich der Name relativ leicht herausfinden. Die Frage ist daher: Wie kommt man an die Adresse des “Aufrufers”?
Windows (im 32-Bit Modus) und somit auch Ragnarok basieren auf der x86 Prozessorarchitektur. Auch wenn man ein 64-Bit Windows verwendet, denn dann wird über WOW64 eine 32 Umgebung “emuliert”.
Ein Funktionsaufruf wird über den call Befehl ausgeführt, ein Rücksprung über ret. Ein call schreibt die Speicheradresse des Befehls nach dem Aufruf auf den Stack und springt zur Funktionsadresse. Ein ret holt sich den obersten Wert vom Stack und springt dorthin zurück. Soweit ganz simpel.
Lokale Variablen innerhalb der Funktion werden ebenfalls über den Stack realisiert. Man kann folglich nicht davon ausgehen, dass das oberste Element die Rücksprungadresse ist und braucht eine Möglichkeit, diese von jeder Position aus zu finden. An dieser Stelle kommt das ebp Register ins Spiel: Das ebp verweist auf die Stackposition, an der sich die Funktion am Anfang befunden hat. Über den Wert von ebp sollte man daher doch relativ leicht an die Rücksprungadresse kommen…?
Mir war der Aufbau eines C(++) Calls bereits bekannt, aber solche Informationen lassen sich auch über Wikipedia oder normale Google Recherche herausfinden.

Testcode:

Die Ausgabe sieht schonmal vielversprechend aus. Die Rücksprungadressen liegen im Bereich der main() Funktion. Dass sich die Adressen immer ändern hängt mit der Address Space Layout Randomization (ASLR) zusammen, wodurch die Basisadresse des Programms sich bei jedem Start verändert. Nichtsdestotrotz haben wir nun eine gültige Rücksprungadresse!

Nun müssen wir dieser Basisadresse den Namen eines Plugins zuordnen. In der Regel sind Plugins eigenständige Dll Dateien. Über die Compilerdokumentation findet man relativ schnell heraus, dass Dlls im Speicher auf 64Kb Adressen alignt sind – die Basisadresse also ein Vielfaches von 64Kb ist.
Eine 32 Bit Applikation kann maximal 4Gb Speicher adressieren. Normalerweise stehen dem Programm nur 2Gb zur Verfügung, da 2Gb für den Kernel reserviert sind. Allerdings gibt es die /3GB Option und unter 64-Bit Windows sieht das Ganze wieder anders aus. Wir müssen also davon ausgehen, dass wir 4Gb / 64Kb = 65536 mögliche Dll Basisadressen haben. Wenn wir im Programm ein Array verwenden, wo für jede mögliche Basisadresse ein Pointer auf den Namen hinterlegt ist, benötigt dieses array 64Kb * 32 Bit = 256 Kb. Durchaus vertretbar.

Problematisch könnte es nun werden, wenn eine Dll größer als 64Kb ist, also effektiv mehrere Basisadressen einnehmen würde. Um diesen Fall abzuhandeln muss beim Laden der Dll aus dem PE Header die SizeOfImage ausgelesen werden:

The size (in bytes) of the image, including all headers, as the image is loaded in memory.

Mit dieser Information kann man einfach ausrechnen wie viele Basisadressen belegt werden.

Wir sind also in der Lage die Rücksprungadresse einer Funktion zu ermitteln und haben ein Array in dem die Namen der Dlls hinterlegt sind. Daraus könnte dann beispielsweise das folgende Testprogramm resultieren: Klick mich.

Ziel erreicht!
Ein paar Tage nach der Entstehung dieser Zeilen bin ich über die MSDN Library auf eine sehr interessante Funktion des Microsoft Compilers gestoßen: _ReturnAddress(). Damit hätte ich mir den ganzen Aufwand sparen können – aber so ist immerhin dieser Artikel herausgekommen, der hoffentlich ein paar Anregegungen geben konnte. :)

Übrigens:
_ReturnAddress:

Meine Version:

Microsoft hat wohl den selben Ansatz verfolgt ;)

Dies und das…

March 18th, 2010 by Sirius_White

Da sich in den letzten Wochen wieder einmal ein wenig was angesammelt hat, fasse ich das einfach mal in einem Artikel zusammen.

Harmony ist “fertig”! Zumindest Version 3.0. Nachdem diese mittlerweile stabil ist und auch bereits produktiv eingesetzt wird, läuft derzeit bereits die Entwicklung von Version 3.1. Bisher beschränkt sich Harmony auf allgemeine Funktionen der vorherigen Versionen, sprich WPE/RPE Erkennung, Paketverschlüsselung und einige andere Techniken sowie eine rudimentäre XRay Implementation (Headgears, Monster und Hairstyles). Ich wollte erst einmal sicher gehen, dass die derzeitige Version stabil läuft und habe daher die Features soweit es geht eingeschränkt. Mit 3.1 werden dann diverse neue Kundenfeatures hinzukommen, wie beispielsweise die einstellbare GRF Verschlüsselung.
Im Gegensatz zu bisherigen Systemen wird Harmony voraussichtlich nicht mehr an eine Exe gebunden sein. Die Core ist mittlerweile so strukturiert, dass die meisten Module keine eigenen Offsets mehr benötigen und somit unabhängig von der Exe sind. Die Harmony Core wird nun voraussichtlich jede Woche auf auf die aktuelle RagRE Exe portiert, sodass prinzipiell jede Exe unterstützt wird. Für die Portierung kommt ein PHP Skript zum Einsatz, was die Offsets über Pattern Matching ausliest. Das Skript gibt es hier zum Download. Aus wohl verständlichen Gründen sind die Harmony Offsets nicht enthalten, dafür aber 2 Beispielskripte.


Einer der Hauptgründe, warum ich Harmony so früh auf die neueste Exe portiert habe, ist folgender Changelog Eintrag:

- You can now mouse over the status icons displayed on the right side of the screen to get information about what the status does.

Wenn sich das bewahrheiten sollte, wäre das eine der besten Änderungen seit Jahren. Und tatsächlich!
Technisch sind für dieses Feature einige neue Lua Dateien hinzugekommen. Eine für die Zuordnung von Effektnamen zu ihren IDs (quasi ein Enum), eine für die Funktionen und eine für die Beschreibungen. Damit wird ein Trend fortgesetzt, dem Gravity nun schon seit einer ganzen Weile folgt: Neue Features nutzen Lua und alte “Kotzfaktoren” werden nach und nach in Lua ausgelagert. Gravitys neue Erkenntnis, dass Contenttabellen im Source irgendwie nicht mehr ganz zeitgemäß sind, kommt der pServer Community natürlich nur entgegen: Anstatt das mittlerweile verpönte XRay zu verwenden kann man nun einfach die Lua Dateien editieren.

Apropos innovative Gravity Features: Wer erinnert sich an den Chatmode?

Ist dieser aktiv, verschwindet das Chatfenster selbst bei doppeltem Enterdrücken nicht mehr – der perfekte Pronmodus eben :)

Gravity Changelog vom 09.03.2010:

Added Chat Mode to the shortcut menu. When enabled, the chat box will always remain open [...]

Das ist ja echt kreativ!


Seit einiger Zeit bin ich nun offiziell Mitglied des Diff Teams. Bedeutet: Ich bin mit dafür zuständig, dass für neue Exen so schnell wie möglich Diffs erstellt werden und mögliche Inkompatibilitäten beseitigt werden. Bisher hatte ich lediglich den “@-Fix” und einen Diff zum Deaktiven des Nagle Algorithmus‘ eingebaut. Bedingt durch meinen Entschluss, zukünftige Exen Harmony-tauglich zu machen, werde ich hier aber wahrscheinlich in Zukunft etwas mehr Zeit investieren. Die heutige Exe hat beispielsweise 5 Diffs zerschossen, die repariert werden durften… :)



Picture unrelated.
Es gibt diverse Server, die sich damit brüsten, ihre Bot Protection sei unüberwindbar, würde alles blocken und sei sowieso die beste Entwicklung seit der Erfindung des Toasters. Keine Bot Protection ist perfekt. Natürlich, aus Sicht des Marketings ist alles aus dem eigenen Hause perfekt, aber wenn selbst Techniker im Einzelgespräch diese Meinung vertreten, haben sie etwas wichtiges verpasst.
Um neue Ideen und Inspirationen für Harmony zu bekommen reverse ich ganz gerne die Bot Protections anderer Server. Das Spektrum reicht hier von “aufgeblasen, komplex und irgendwie nach dem Motto just bore the reverser long enough” bis “cool, 3 Zeilen und OpenKore funktioniert nicht mehr”. Bisher habe ich keine Protection gesehen, die sich nicht binnen 20 Minuten umgehen ließ. Das sagt allerdings relativ wenig über die allgemeine Qualität der Systeme aus – es liegt schlicht und einfach daran, dass es Mittel und Wege gibt, mit der (fast) jede Bot Protection ausgehebelt werden kann.
Nachdem V-Shield schnell für Enttäuschung gesorgt hatte, waren meine Erwartungen nicht sonderlich hoch, als mir vor einigen Tagen von einer “selbstgeschriebenen Bot Protection” auf einem deutschen Server berichtet wurde. Das System ansich war relativ schnell reverst, aber die Codequalität war vergleichsweise hoch und es wurden einige hochinteressante Ansätze genutzt, die mir bisher in der Praxis noch nie begegnet waren.
Da ich auf dem Server eh nicht spiele habe ich dann frei nach dem Holzhammer-Motto per Try&Error durchprobiert, was die Protection alles erkennt. Wie sich herausstellte hat sie den Server über die Ergebnisse informiert (zumindest über die Tatsache, dass es Ergebnisse gab) – ich wurde ins GM Haus recallt und bin dort mit dem Admin ins Gespräch gekommen.
Es stellte sich heraus, dass Godlesz ihm eine Anleitung gegeben hatte, wie man eine solche Bot Protection implementiert. Wenn man sich überlegt, dass er noch vor 2-3 Jahren von Timo Programmiernachhilfe bekommen hat, ist das eine durchaus beachtliche Leistung.

Ansonsten habe ich nun noch 7 Tage Schule — dann sind Osterferien und in der Woche darauf bekomme ich mein 12/2 Zeugnis. Ende April dann noch Abiprüfungen und ich bin mit der Schule fertig. Die Zeit vergeht schnell

Gulli Board

March 2nd, 2010 by Sirius_White

4chan bezeichnet sich ja selber als der Abfluss des Internets. Zu Recht. Das Gulli Board ist offenbar das deutsche Pendant dazu. Es wurde mir oft empfohlen, wirklich angeschaut habe ich es mir aber nie. Bis heute.
This is Sparta!

Bei einem ganz normalen Gespräch über uralte, eiskalte, pappige Pizza (Hallo, Anni!) mangelte es mir an einer Visualisierung. Nach kurzer Google Suche landete ich dann hier: Herrjemine, Pizza zu kross gebacken!

Wer fragt im Internet nach, ob seine Pizza zu dunkel ist?!
Offenbar gibt es Menschen. Ich würde wenigstens jemandem im Skype anrufen und um eine Webcambegutachtung bitten… ;)

Ob es da noch andere ähnlich kranke Threads gibt…? Tatsache.
Aktuellste Frage mit 55 (!) Antworten:
   Beste Atemtechnik bei der Katzenkloreinigung

Ich zitiere und unterstreiche einfach mal die erste Antwort:

Manche Leute sind einfach interessanter gestört als andere



Und jetzt entschuldigt mich. Ich habe 11 Millionen Postings zu durchwühlen… =)4chan bezeichnet sich ja selber als der Abfluss des Internets. Zu Recht. Das Gulli Board ist offenbar das deutsche Pendant dazu. Es wurde mir oft empfohlen, wirklich angeschaut habe ich es mir aber nie. Bis heute.

Bei einem ganz normalen Gespräch über uralte, eiskalte, pappige Pizza (Hallo, Anni!) mangelte es mir an einer Visualisierung. Nach kurzer Google Suche landete ich dann hier: Herrjemine, Pizza zu kross gebacken!

Wer fragt im Internet nach, ob seine Pizza zu dunkel ist?!
Offenbar gibt es Menschen. Ich würde wenigstens jemandem im Skype anrufen und um eine Webcambegutachtung bitten… ;)

Ob es da noch andere ähnlich kranke Threads gibt…? Tatsache.
Aktuellste Frage mit 55 (!) Antworten:
   Beste Atemtechnik bei der Katzenkloreinigung

Ich zitiere und unterstreiche einfach mal die erste Antwort:

Manche Leute sind einfach interessanter gestört als andere



Und jetzt entschuldigt mich. Ich habe 11 Millionen Postings zu durchwühlen… =)

PhaseRO Skripte

February 19th, 2010 by Sirius_White

Als ich Admin auf PhaseRO wurde gab es vor allem einen großen Wunsch der Community: Mehr Events!
Es drohte bereits der Serverwechsel einiger großer Gilden, daher hatten, vor allem in den ersten paar Wochen, Events mit die höchste Priorität.

In der Zeit zwischen Valentinstag und Ostern 2009 entstanden daher einige interessante Skripte. PhaseRO ist mittlerweile leider offline. Ich bin aber der Meinung, dass es Verschwendung wäre, die Skripte einfach in meinen Backups vergammeln zu lassen.

Invasions

Jede Woche gab es eine neue Town Invasion. Mit einer Ausnahme fanden diese Invasions immer in Prontera statt. Anfangs wurden Wellen von Monstern zufällig auf der Map verteilt, dadurch verteilten sich die Spieler jedoch zu stark. In den späteren Invasions spielte ein GM (ich…) im Disguise-Modus den MVP und spawnte per Whisper Command die Monsterwellen. Letztendlich wurde der GM per Command versteckt und der MVP gespawnt. Auf der Script Roadmap stand kurz vor Schließung des Servers noch eine Automatisierung der Skripterstellung, damit auch normale Event GMs diese durchführen können – dies wurde leider nie realisiert.

Einige Invasion Skripte: Prontera 1, Prontera 2, Evil Snake Lord, Endless Tower, Winter (Ankündigung)

Etwas spezieller war die Lighthalzen Invasion. Nach der ersten, erfolgreichen, Invasion in Prontera wollte ich das Ganze etwas kreativer gestalten und habe eine grobe Storyline eingefügt. Die Spieler mussten während des Events mal in den Slums kämpfen, mal in der Stadt. Hintergrund war ein mysteriöser Rohrbruch am BioLab Eingang, durch den Monster in die Stadt kamen. Während des Events versuchte ein Techniker den Rohrbruch (der sich schnell auf die Stadt erweitert hatte) in den Griff zu kriegen. Dabei passieren ihm kleinere Missgeschicke, so wurden beispielsweise kurzzeitig alle Spieler auf der Map verwandelt. Letztendlich erhob sich der Lord of the Pipe aus den Tiefen des Rohes. (ja, ich bekam dafür Schläge vom Story-GM…)
Wahrscheinlich war das Event einfach zu schnell oder die Spieler wollten einfach nicht lesen. Jedenfalls wusste niemand so recht was er jetzt machen muss – bis auf die wenigen Ausnahmen, die die Broadcasts gelesen und verstanden haben. Unsere Schlussfolgerung aus dem Desaster war dann, dass wir uns in Zukunft auf simple Pronterainvasions beschränken würden. Weniger Arbeit für uns und offenbar mehr Spaß für die Spieler.

St. Patricks Day

Ein Feiertag der mir bisher nur vom Namen geläufig war. Nichtsdestotrotz haben wir gut eine Woche das passende Event geplant. Letztendlich gab es eine Brauerei mit irgendwelchen Cooking-Rewards – mit dem Skript hatte ich, abgesehen vom Bugfixing, allerdings nichts zu tun. Dazu wurden am Wochenende auf zufälligen Field Maps Leprechauns (kleine grüne Cookies aus der Toy Factory) gespawnt. Auf jeder Map mit Leprechauns befand sich ein Regenbogen. Wurde einer der Leprechauns getötet verschwanden sie und unter dem Regenbogen erschien eine Schatztruhe. Während das Event lief waren im Schnitt immer auf 5-20 Maps Regenbögen und Leprechauns zu finden.
InvasionLeprechaun Skript

Ostern
Die grundlegende Osterstory: Alle freuen sich auf ein schönes Osterfest, als plötzlich und völlig unerwartet am Sonntag zum Zeitpunkt der Invasion der böse Bruder des Osterhasen die Macht ergreifen will. Er wird zurückgeschlagen und zieht sich erst einmal zurück. Im Laufe der Woche fand der erste Teil des Events statt: 40 Osterhasen haben zufällig Spieler auf der ganzen Welt besucht und haben dort 5 Minuten lang Buffs verteilt. Dahinter stand wohl das komplexeste eAthena Skript was ich je geschrieben habe, aber bis auf ein Locking Problem lief es problemlos. Am Osterwochenende wurde dann der zweite Part aktiviert, eine modifizierte Version des St. Patricks Skriptes: Auf allen Fieldmaps waren Ostereier versteckt (~400 insgesamt). Nach bestimmten zeitlich festgesetzten Belohnungsgrenzen bekamen die Spieler dann entweder Eventpunkte oder Special Payments (Art Donation Währung auf PhaseRO). Zu einer ~15%igen Chance hatte der böse Osterhase diese Eier allerdings verflucht: Beim Berühren explodierten sie und spawnten je nach Level unterschiedliche Monster. Allgemein wurde das Event sehr positiv aufgenommen und hat auch teamintern eine Menge Spaß bereitet.
InvasionEvent Skript

Event Warp
Beim ersten Invasion Event waren viele Spieler gar nicht erst aufgetaucht, weil sie gerade in irgendeinem Dungeon waren. Daher wurde relativ früh ein System eingeführt, mit dem man per NPC festlegen konnte, wo das Event statt finden sollte. Spieler konnten dann Event anwhispern, wurden zum Ort des Geschehens gewarpt und konnten nach Beendigung wieder zu ihren alten Levelorten zurückkehren. Weiterhin war während der Events ein Auto-Resurrection Timer aktiv, um die vielen Leichen effizienter zu reanimieren.
Skript

Google und die Literatur …

February 17th, 2010 by Sirius_White

… das klappt nicht immer.

Ragnarok Hosting Service

February 16th, 2010 by Sirius_White

Mal ein ganz eigennütziger Beitrag: Mit T-Bash betreibe ich nun seit geraumer Zeit einen Hosting Service für RO. Unser Hauptinteresse ist es, dass die Serverkosten getragen werden – großartig Gewinn schieben wir dadurch also nicht.

Jeder Kunde bekommt bei uns einen dedizierten V-Server. Bevor das nun als gameserveruntauglich abgestempelt wird – wir setzen auf Qualitätsserver. Heißt: Unsere Server sind nicht überfüllt, für jeden Kunden mehr als ausreichend Performance vorhanden, auch um unvorhersehbare Lastschwankungen abzufangen. Aber genug der Worte, einige Fakten:

Was bekommt man?

  • 1024 / 2048 Mb RAM (zugesichert / Burst)
  • 2 CPU Cores (Fair-Use)
  • 100 Gb Plattenspeicher
  • Unlimitierten Traffic (Fair-Use)
  • Webspace für Homepage
  • Patchspace (HTTP / Anonymous FTP)
  • Zugriff auf Datenbankserver
  • Automatisierte Backups
  • Support (eingeschränkt, siehe unten)
  • Auf Wunsch: Grundeinrichtung

29,95 EUR pro Monat (keine Einrichtungsgebühr)


Gameserver
Die Gameserver liegen auf einem Intel Core i7 920 mit 8 GB DDR3-1333 RAM. Unsere derzeitige Serverauslastung liegt bei etwa ~5% CPU Leistung und ~60% RAM Nutzung. Engpässe sollten also vorerst nicht auftreten.

Datenbankserver
Ihr bekommt Zugriff auf einen zentralen High-Performance Datenbankserver. Das bedeutet, dass der Gameserver maximale Performance bekommt und von keinen Datenbankzugriffen ausgebremst wird.

Support
Aufgrund unserer jahrelangen Erfahrung, sowohl im Bereich des RO Hostings, als auch mit allgemeiner Serveradministration, können wir euch bei vielen Problemen kurzfristig weiterhelfen. Wir haben den lieben langen Tag natürlich noch viel anderes zu tun und wir können nicht jedem 24 Stunden am Tag unsere Aufmerksamkeit widmen – es gilt hier also auch eine Art Fair-Use. ^_^

Backups
Datenverlust ist scheiße. Daher werden alle Datenbanken mehrfach täglich (Standard: alle drei Stunden) gesichert und auf vier physikalisch getrennte Servern verteilt. Eure Daten sind also sicher.

Fair-Use
Wir geben euch einen gewissen Vertrauensvorschuss und setzen keine genauen Traffic- oder CPU-Limits fest. Solltet ihr beispielsweise einen plötzlichen Spieleransturm haben und die Webseite benötigt kurzzeitig mehr Traffic – kein Problem. Torrentseeds sind dahingegen logischerweise weniger erwünscht. Grundsätzlich gilt: Was für einen Server eurer Größe realistisch vertretbar ist, bewegt sich im Rahmen. Im Zweifelsfall einfach kurz nachfragen.

Sollte jemand Interesse haben, einfach eine kurze E-Mail an hosting [at] un-a [dot] eu schicken. Details können dann kurzfristig über ICQ / MSN oder per Mail geklärt werden.

Hamburg, Teil 2: InnoGames

February 9th, 2010 by Sirius_White

Manchmal kämpft man jahrelang gegen ein Vorurteil, um am Ende wieder davon eingeholt zu werden.
Ein Großteil meiner Programmier- und allgemeinen IT-Kenntnisse habe ich über Ragnarok erlangt. C hat mit einigen eAthena Commands begonnen, Linux mit “Hey Sirius, du kennst dich doch aus – wie mache ich den Server unter Linux wieder aus?” “.. Öh, gute Frage”.
In der Schule stehe ich seit einigen Jahren quasi unter Generalverdacht, ein Zocker übelster Sorte zu sein. Meine Englischlehrerin wundert sich, warum ich nicht “Computer-Techno-Musik” höre und freie Zeit verbringe ich sowieso ausschließlich mit Zocken. Zugegeben, meine Seminarfacharbeit “Suchtpotenzial von Onlinespielen” war für meinen Kampf gegen dieses Vorurteil nicht gerade hilfreich, aber immerhin konnte ich die Frage, ob ich diese gefährlichen Onlinespiele denn selber konsumieren würde, stets verneinen!
Meine Suche nach einem dualen Studienplatz bin ich daher eigentlich vollkommen unvoreingenommen angegangen. Ironischerweise wirkte ein Unternehmen jedoch am vielversprechendsten – InnoGames, die Entwicklerfirma von Browsergames wie Die Stämme. Also doch Spielebranche? Mitte Januar habe ich nach einem Telefoninterview und einem Bewerbungsgespräch in Hamburg die Zusage bekommen. Einer der Entwickler hatte beim Bewerbungsgespräch einen Punkt angesprochen, den ich bereits befürchtet hatte: Durch meine bisherige Arbeit mit anderen Programmiersprachen könnte ich mich auf Dauer bei InnoGames unterfordert fühlen. Glücklicherweise wurde es mir jedoch sehr kurzfristig ermöglicht, meine Winterferien für ein Praktikum dort zu nutzen, wodurch ich einen ersten Eindruck bekommen konnte.

Das Video, mit dem sich InnoGames als Arbeitgeber vorstellt, beschreibt die Situation in der Firma wirklich recht passend:

Kay Schnittker, der als “Head of Tools” für den Entwicklungsbereiche Payment und Tools verantwortlich ist, betreute mich in der Woche. Daher wurde ich anfangs auch erst einmal in die verschiedenen Backend-Tools von InnoGames eingeführt – neben den klassischen Support-, Payment- und Übersetzungstools waren es doch überraschend viele. Mit den entsprechenden SVN Zugängen ausgestattet bekam ich die Aufgabe, eine Suchfunktion in einem der Tools einzubauen und mich dort ein wenig einzuarbeiten. Ich hatte vorher noch nie mit dem Zend Framework, bzw. dessen MVC Komponenten gearbeitet. Dementsprechend aufgeblasen wirkte das Konstrukt. Nach einer Weile ergab es aber alles irgendwie Sinn und mir erschloss sich auch der praktische Nutzen dieser Bloat-Lösung.
Anschließend wurde mir über eine kleine Frage zum Servercluster ein umfassendes Gespräch mit einem der Admins vermittelt. Ähnlich verlief es auch den Rest der Woche: Kay vermittelte mir in so ziemlich jeder Abteilung ein Gespräch, was mir über die Woche einige hochinteressante Einblicke verschaffte.

Um diesen Artikel nicht zu einer weiteren Wall-of-Text zu machen – hier ist ein Bild von einem Rotkehlchen, gefolgt von einer kurzen Erkenntnisliste!
Rotkehlchen!
(c) Andreas Trepte

  • Im The West Büro ist PHP nicht sonderlich beliebt – jüngster Erfolg ist die Durchsetzung eines Java Daemons.
  • Grepolis ist objektorientiert!
  • Die Stämme wären gerne so objektorientiert wie Grepolis, sind dafür aber zu alt. Das erfreut das Programmiererherz Tag für Tag.
  • Game Designer wissen nicht so ganz, wie ihre Arbeit definiert ist – haben davon aber mehr als genug.
  • Man hat immer Zeit zum Kickern. Wenn auch nicht immer für die Rückrunde.
  • CBT steht für “Cock and Ball Torture“. Quelle: Bürointerne Mailingliste – ein koreanischer Geschäftspartner hatte mit der Abkürzung CBT um sich geworfen. Die Bedeutung eröffnete sich spätestens nach einer Google Suche ;-)
  • Und letztendlich der Hinweis, der nach einer Woche Kaffeekonsum wohl am interessantesten ist: “Sei vorsichtig mit der Kaffeemaschine, ich würde vorher dran riechen, bevor ich trinke” … Oh.

Hamburg, Teil 1: Reisegeschichten

February 6th, 2010 by Sirius_White

Die letzten Winterferien meines Lebens sind nun schon wieder fast vorbei. Ich habe die Woche genutzt, um ein Praktikum bei InnoGames zu machen. Nicht wirklich ein Praktikum, eher ein “Reinschnuppern”, da ich ab August dort mein duales Studium absolvieren werde. Glücklicherweise konnte ich bei T-Bash unterkommen, musste mir also keine Pension suchen. Einziger Nachteil: Er wohnt am anderen Ende von Hamburg.
Meine letzte Woche bestand also aus Aufstehen, Zug fahren, Inno, Zug fahren, essen und schlafen. Auf die Zeit bei Inno werde ich im zweiten Teil eingehen – ich muss zuerst meine Erfahrungen mit der Deutschen Bahn, beziehungsweise dem Hamburger Verkehrsverbund (HVV) los werden. Um kurz die (geplanten) Routen zu verdeutlichen:

Hinfahrt:

    Eisenach -> Kassel – IC (mit Platzreservierung)
    Kassel -> Hamburg – ICE (mit Platzreservierung)

Rückfahrt:

    Eisenach -> Kassel – ICE (mit Platzreservierung)
    Kassel -> Bebra – CAN
    Bebra -> Eisenach – CAN

T-Bash <-> Inno

    Halstenbeker Stieg -> Elbgaustraße – Bus (185 / 284)
    Elbgaustraße -> Harburg Rathaus – S-Bahn (S3 / S31)
    Harburg Rathaus -> InnoGames – Laufen

Erwartungsgemäß blieb es meistens nur in der Theorie bei diesen Routen.

Sonntag: Stehplatz deluxe
Erste Feststellung am Bahnhof Eisenach: Mein Zug fällt aus!
Ich also bei der Info angestellt, mir den Ausfall bescheinigen lassen und einen Ausweichzug über Fulda vermittelt bekommen. Da nicht nur mein Zug ausfiel und es noch ein paar andere Reisende Richtung Kassel gab, war der Zug dementsprechend brechend voll und ich durfte mir mit meinem Gepäck einen halben Stehplatz in einer penetranten, automatisch schließenden Tür teilen. Angekommen in Fulda wurde erst einmal durchgesagt, dass der ICE Richtung Hamburg 45 Minuten Verspätung haben würde. Glücklicherweise wurde ein außerplanmäßiger Halt eines anderen ICEs arrangiert und ich konnte nach einer halben Stunde Wartezeit einen Stehplatz in besagtem ICE ergattern. Nach einer gefühlten Ewigkeit wurde in Hannover sogar ein Sitzplatz frei! Die restliche Fahrt verlief erfreulicherweise dann relativ unspektakulär – nur noch Verspätungen im einstelligen Minutenbereich.

Montag: Flammen, Rauch, Verspätung!
Morgens verlief die Fahrt (abgesehen von der üblichen Busverspätung) ohne Probleme. Abends lief bis zum Bahnhof Elbgaustraße ebenfalls alles glatt. Ich habe den Bus Richtung Halstenbeker Stieg gerade noch von hinten sehen können, 2 Minuten später gefolgt von einer mittleren Kolonne Polizei- und Feuerwehrwagen. Als dann 10 Minuten später mein Bus kam war die Straße 500m weiter bereits komplett gesperrt und ich durfte den Bus nach angenehm warmen 30 Sekunden wieder verlassen. Es stellte sich heraus, dass ein Haus am Straßenrand gerade munter abbrannte – ironischerweise 200m von der Freiwilligen Feuerwehr entfernt. Auf meinem Fußweg rannten zumindest 5 Nachwuchsfeuerwehrleute an mir vorbei und fluchten lautstark über die Entscheidung, zum Brand laufen zu müssen. Am Ort des Geschehens war bereits alles verraucht und es hatte sich der übliche Pulk Gaffer gebildet. Über 4 Handytelefonate wurde ich zur nächsten Bushaltestation geleitet, um von dort zur nächsten S-Bahn Station zu fahren, um von dort dann den Rest zu laufen. Der restliche Fußweg war zwar nur geschätzte 2-3km lang, hatte es dank spiegelglatter Gehwege aber dennoch in sich.

Dienstag: Fußweg
Da in Hamburg während der gesamten Woche mehr oder weniger Wetterausnahmezustand herrschte, versuchte ich gar nicht erst einen fahrenden Bus zu erwischen, sondern wählte für Hin- und Rückweg den erwähnten Fußweg zur S-Bahn, es verlief daher auch alles glatt. Spiegelglatt – da Hamburg kein Streusalz mehr hatte und der Nachschubfrachter sich wohl verspäten sollte, war fast nirgendwo gestreut – auf Gehwegen schon gleich gar nicht.

Mittwoch: Verspätung <3
Morgens durfte ich wieder 20 Minuten auf den Bus warten, abends war aufgrund eines Polizeieinsatzes meine S-Bahn ebenfalls um 25 Minuten verspätet. Yey.

Donnerstag: Mittlerer Arsch der Welt
Der morgendliche Weg zum Bus war dank mangelndem Streusalzes wie immer eine Rutschpartie, die Busfahrt soweit aber kein Problem. Nun gibt es 3 S-Bahn-Linien, die von Elbgaustraße fahren: S3, S31 und S21. Letztere verwechselt man ganz gerne, vor allem wenn man gerade noch in den Zug hechten kann und bis zum Hauptbahnhof auch alles soweit richtig ist. Die Bahnfahrt dauert normalerweise 43 Minuten und es war zu dem Zeitpunkt meistens vor 8 Uhr morgens – ich habe die Zeit also zum Schlafen genutzt. Aus bloß-nicht-verpennen Gründen wache ich ca. alle 4-5 Haltestellen auf und vergewissere mich, dass ich noch weiterschlafen kann. Mein letztes Aufwachen war Dammtor, also noch eine Weile vor Harburg. Das nächste Mal bin ich dann aufgewacht und durfte mit einem Blick aus dem Fenster feststellen, dass ich irgendwo außerhalb des dicht bebauten Stadtgebiets auf einem tief verschneiten Bahnhof war: Mittlerer Landweg. Um das einmal zu verdeutlichen:

Arsch der Welt
A = InnoGames
B = T-Bash
C = Arsch der Welt aka. Mittlerer Landweg

Ich habe zugesehen, dass ich aus dem Zug komme und auf die nächste Bahn Richtung Zivilisation gewartet, welche 15 Minuten später dann auch kam – vollbepackt mit Zivilisation. Genauer gesagt mit geschätzten 50 herumspringenden Kindergartenkindern. Über Hauptbahnhof bin ich dann endlich in die richtige S-Bahn gekommen und kam mit 40 Minuten Verspätung gegen halb 10 bei Inno an.

Freitag: Richtung wechsle dich
Da mein Zug um 17:24 Uhr fuhr und ich deshalb nicht mehr Zeit haben würde, meine Tasche bei T-Bash abzuholen, habe ich sie am Hauptbahnhof in einem Schließfach verstaut. Gegen 16:30 Uhr ging es dann zurück zum Hauptbahnhof – logischerweise mit der S-Bahn Richtung Hauptbahnhof. Bloß blöd, dass dieser Zug entgegen des angezeigten Zielbahnhofs in die andere Richtung fuhr. Nachdem mich der Spaß also wieder 15 Minuten gekostet hat ging es dann mit dem richtigen Zug in die richtige Richtung. Mein Anschlusszug kam sogar pünktlich! Allerdings fehlte Wagen 6, wodurch die Wagenreihenfolge etwas chaotisch war und ich eine Weile nach meinem Sitzplatz suchen durfte. Ich weiß nicht, was die Bahn da angestellt hat, aber in Kassel fehlte in zwei weiteren ICEs ebenfalls Wagen 6. Dennoch – die Rückfahrt verlief ohne nennenswerte Probleme. Home, sweet home!