Hier werden sich einige bestimmt fragen:
Realm-was?
Ich gebe erst einmal eine kleine Erklärung was damit gemeint ist.
RealmPools ist ein Verbund vieler Server zu einem Pool, um zum Beispiel Battlegrounds oder Dungeon zusammen machen zu können.
Im Prinzip kann man sich das genauso wie bei Blizzard vorstellen.
Dort spielt man, wenn man einen Battleground betritt, nicht vorwiegend gegen Spieler seines eigenen Realms sondern kann auch Spieler dabei haben, die von einem anderen Realm kommen.
So kann es passieren das man auf Spieler vom Arthas-Realm antrifft, obwohl man auf Onyxia spielt.
Gleiches kann auch während der Benutzung DungeonBrowsers passieren...
Nun möchte ich euch keinen Vortrag darüber halten warum Blizzard sowas hat, sondern zum einen sagen das ich so ein Teil grade programmiere und zum anderen einen kleinen Einblick geben wie man sowas selbst proggen könnte.
Als erstes brauchen wir einen WorldServer, ich habe mich dazu entschieden die TrinityCore zu nutzen, weil ich mit der Core den Spaß schon einmal gemacht hatte und sie bis jetzt ganz positiv darauf reagierte als Node gefahren zu werden.
Zum anderen brauchen wir ein Programm was die Datenströme unseres Clients aufnimmt und an die jeweilige Core weiter gibt.
Quasi einen "intelligenten" Proxy.
Weil ich nicht den WorldServer komplett umbauen möchte sondern ihn weiterhin auch als Standalone nutzen möchte, müssen wir nun den Proxy so umbauen das er die OpCodes des Clients futtert und ggf an den WorldServer routet, gleiches gilt auch für die Pakete vom WorldServer an den Progy (LogonServer), denn es dürfen nicht alle Pakete an den Client.
Im Prinzip hätten wir damit 3 Server, Realm, LogonServer (Proxy) und WorldServer.
Zugegeben, ich hab den LogonServer der Einfachheit aus einem WorldServer gebaut.
Hat ein paar Vorteile:
- man braucht sich keine Sorgen um die Sockets zu machen
- man kann leicht einen neuen Connector-Tread einbauen
- der WorldServer kennt alle OpCodes und kann fröhlich erweitert werden um zu routen
- ScriptSystem ist schon drinnen
- man kann ihn als Backup im Hintergrund fahren lassen
- etc.
Naja, hat man nun den LogonServer stehen sollte man aufpassen, der WorldServer ist ein bisschen empfindlich was die OpCodes und Datenströme angeht, so hab ich das problem das ich nun nach jedem OPCODE einen UIN16(00) und dann den Inhalt senden darf...
Etwas zickig halt, wer es nachbauen will, wird schon selbst auf das Problem stoßen xD
Um beide Betriebsarten zu gewährleisten sollte man ggf eine zweite AUTH-Routine bauen, so das man nicht auf einmal Spieler aufm Node hat und der sich wundert warum nix geht
Hat man das kann man noch den Playerlogin vom LogonServer vorgaukeln lassen und man hat seinen Char auf Logon und Node stehen.
Jetzt noch fröhlich OpCodes sortieren und ausbauen.
Mein jetziger Stand nach 2 Wochen arbeitszeit ist:
- Sockets sind drinnen
- Verbindung zum Node läuft
- Unter Linux keinen Deadlock xD
- OpCodes zum größten Teil zugeordnet
- 4. Datenbank angelegt
- AUTH-Routine erneuert
- Port von World/NodeA zu Node B drinnen (also einfaches Switchen der WorldServer per Script)
- Mehr aufgeräumt
Nicht viel, aber funktionierend xD
Hier noch ein paar Screens:
LogonServer hatte leere DB, also keine Objects beim einloggen sichtbar.
Erst ab verbindung zum WorldServer kamen alle NPCsund Objects.
Hier waren beide leer xD
Mal schauen was sich so alles mit dem Teil zaubern lässt, Spaß machts definitiv sowas zu proggen.
LG Kent Brockman