Skip to content

Instantly share code, notes, and snippets.

@Nithanim
Last active June 28, 2024 19:12
Show Gist options
  • Save Nithanim/33c27ff0cc82d7d43f4dbe3e348ef543 to your computer and use it in GitHub Desktop.
Save Nithanim/33c27ff0cc82d7d43f4dbe3e348ef543 to your computer and use it in GitHub Desktop.
GW2 Allianzen und API

GW2 Allianzen und API

Kürzlich ist es kurzzeitig so gewesen, dass anstatt der neuen Weltennamen, die Namen alter Server im Spiel angezeigt wurden. Natürlich war die Verwirrung groß und geschimpft wurd auch von ein paar klugen Spezialisten. Das ganze ist aber im Hintergrund normal und funktioniert aus der meiner sehr eingeschränkten Sicht von außen noch exakt gleich wie damals bei den temporären Betawochen.

Viele Informationen hier sind "educated guess"es. Sprich, aufgrund von dem was ArenaNet preis gibt, Beobachtungen des Verhaltens des Spiels und meinen Erfahrungen als Programmierer versuchen wir gemeinsam hinter hinter die Kulissen zu schauen. Dabei ist es wichtig im Hinterkopf zu behalten, dass nur ArenaNet weiß, wie alles funktioniert und wir hier nur "raten".

Server und Welten

Megaserversystem

Anfangs zu GW2 musste man sich einen Server aussuchen und man traf nur Spieler dieser Server. Das umfasste auch das PvE. Durch das Megaserversystem (in World of Warcraft: Sharding) wurde das dahingehend verändert, dass nicht mehr ein Server (stark vereinfacht gesagt) nur seine Spieler auf den Karten haben kann. Vielmehr ist es nun so, dass die Spieler von verschiedenen Servern auf einer Karte spielen können. Das dürte es für ArenaNet auch vereinfacht haben, da jetzt nur noch immer genügend Instanzen einer Karte verfügbar sein müssen, komplett unabhängig von anderen Faktoren. Dadurch kommt auch das "Karte schließt" zustande, wo man 1 Stunde (?) Zeit hat, auf eine vollere Instanz der selben Karte zu wechseln, um wieder mehr Spieler antreffen zu können.

Welten

Kommen wir nun zum eigentlichen, technischen Teil auf den ich eigentlich hinauswollte. Computer arbeiten viel liebr mit Zahlen als mit Text, weswegen jeder Server eine eigene ID hat. Beispielsweise hat Abaddon's Mouth [DE] die ID 2204.

Als kleine Randnotiz: In der technischen Sprache von ArenaNet wirden sie "Welten" und nicht "Server" genannt. Bzw. werden vermutlich Server schon als "Server" bezeichnet, aber jeder Server repräsentiert genau eine "Welt". Diese Sicht darauf wird später vielleicht klarer (und ist effektiv eifentlich auch nicht so wichtig).

ArenaNet hat sich offensichtlich darauf festgelegt, dass alle IDs aus 4 Ziffern bestehen. Es gibt auch andere Eigenshaften. So ist die 1. Stelle die Unterscheidung NA/EU. Die 2. Stelle kennzeichnet die Sprache des Servers. Die restlichen 2 sind zur Durchnummerierung.

Testweise können wir bei ArenaNet direkt Infos abfragen: https://api.guildwars2.com/v2/worlds?ids=all Wenn man den Firefox verwendet, dann wird das Ergebnis auch relativ schön dargestellt. Im Prinzip bekommt man eine Liste aus allen Welten wobei die ID und der zugehörige Name mitgeliefert werden.

  {
    "id": 2204,
    "name": "Abaddon's Mouth [DE]",
    "population": "Medium"
  }

Matches

Im WvW spielen "3" Welten gegeneinander. Wobei das ja schon nicht so richtig ist, weil es eigentlich Teams sind. Kleinere Server wurden im alten System mit größeren Servern zeitlich begrenzt zusammengelegt, um einer möglichen Machtkonzentration von duch unterschiedliche Spielerzahlen entgegenzuwirken. Vereinfacht gesagt wurden Server mit Auslastung "sehr hoch" gegen ein Team aus "mittel" und "niedrig" gegenübergestellt.

Damals wie heute konnte man wieder automatisiert bei ArenaNet nach Informationen Fragen. Ein Matchup lieferte z.B. foldgendes, gekürztes Ergebnis:

{
  "worlds": {
    "red": 2001,
    "blue": 2008,
    "green": 2007
  },
  "all_worlds": {
    "red": [
      2001
    ],
    "blue": [
      2204,
      2008
    ],
    "green": [
      2203,
      2007
    ]
  }
}

"worlds" sind hierbei die "Hauptwelten" die gegeneinander spielen. Beispielsweise speilt hier "Fissure of Woe" (2001) gegen "Whiteside Ridge" (2008) und "Far Shiverpeaks" (2007). Nicht weniger interssant ist aber auch "all_worlds". Dort sind unter den selben Farben (Teams) zusätzlich zu den Server aus "worlds" auch noch andere dabei. Das sind die kleineren Server, die mit größeren Servern ein jeweils ein Team bilden, um eben das Kräfteverhältnis etwas auszugleichen.

Allianzsystem

Schon während den Betawochen hatte ArenaNet ein großes Problem: Sie mussten das bestehende System ja so beibehalten wie es war, aber dennoch irgendwie schaffen, für zumindest ein paar Wochen am Stück ein völlig anderes System zu nutzen. Erschwerend war noch dazu, dass man sich ja keine Spielpausen leisten kann, da die Spieler sonst auf die Barrikaden gehen.

Kurz: Nahtlos im Livebetrieb automatisiert von einem System auf ein anderes wechseln. Hut ab!

Kluge Köpfe bei ArenaNet kamen auf den Gedanken, dass man nicht alles austauschen muss. Das spiegelt sich deutlich wieder, wenn wir nochmals nach dem Matchup fragen: https://api.guildwars2.com/v2/wvw/matches?ids=2-6

{
  "worlds": {
    "red": 2001,
    "blue": 2008,
    "green": 2007
  },
  "all_worlds": {
    "red": [
      12001,
      2001
    ],
    "blue": [
      12008,
      2204,
      2008
    ],
    "green": [
      12007,
      2203,
      2007
    ]
  },
}

"worlds" kommt uns noch bekannt vor, aber bei "all_worlds" gibt es IDs mit 5 Stellen! Die haben wir aber gar nicht erhalten, wie wir Informationen zu allen Wleten abgefragt haben.

Das meinte ich mit den "klugen Köpfen". Sie haben neue "Welten" erstellt, die alle Allianen repräsentieren und damit eine Möglichkeit gefunden, die Allianzen ins bestehende System zu integrieren. Z.B. hat "Silent Woods" so eine 5-Stellige ID. Damit haben sie einen relativ einfachen Weg gefunden, das neue System ins alte zu integrieren.

Alt und Neu

Da wir jetzt den Basisstein für den Parallelbetrieb haben, können wir uns dazu jetzt mehrere Seiten ansehen.

Was deer Spieler diekt im Spiel sehen kann ist sein aktuelles Matchup. Hier steht auch die Auswahl der Karte bereit. Beim Umschalten aufs neue System muss hier "nur" auf die 5-Stelligen Welten-IDs gefiltert werden, woduch die Anzeige und Auswahl automatisch richtig ist. (Es ist wahrscheinlich nicht ganz so einfach, reicht für unsere Zwecke hier aber aus.)

Kümmern müssen wir uns aber auch noch um die Zuweisung. Bisher wurde vermutlich eifach direkt der Server des Account für die Zuordnung zum Team verwendet. Also wenn ein Spieler die Übersicht geöffnet hat, wurde geschaut, welchem Server der Spieler angehört und dadurch das richtige Matchup gesucht.

Für das Allianzsystem wurde wohl genau dort eingehakt. Es wird jetzt geschaut, in welche Allianz sich das Account befindet und darüber dann die Welten-ID. Und mit dieser dann werden die Infos angezeigt, bzw. wie die Teamzuordnung beim Beitritt auf eine Karte bestimmt.

Gedanken

Das ist grob alles, was man von außen relativ einfach beobachten und sich daraus ein Bild machen kann. Wie leicht das wirklich umzusetzen war, auch in Anbetracht dessen, dass es nahtlos umgeschaltet werden können muss, lässt sich nicht genau sagen.

Mit dieser sicht scheint es jedenfalls nicht extrem kompliziert. Ich könnte mir dennoch vorstellen, dass es an manchen Punkten nicht ganz trivial war, von der einfachen ID wegzugehen. Ich hatte effektiv ein relativ ähnliches Problem auf der Arbeit und brauchte dort mehrere Anläufe und hat mir mehrere graue Haare beschert.

Aus meiner Sicht war das größte Problem, eine gute Formel für die Verteilung der Spieler zu finden. Unter anderem aufgrund vielfältiger Variablen:

  • Größe der Gilden
  • Tageszeit
  • Wochentag
  • Skilllevel
  • Sprache (?)

Addendum

Zurück zum anfänglichen Anlass der alten Servernamen in der Übersicht. Meine Vermutung ist, dass ArenaNet Serverseitig einiges mehr dynamisch Anpassen kann, als ich angenommen habe, ohne den Client updaten zu müssen. Ich nehme an, dass sie jetzt schon mitten drin sind, das alte System graduell zu entfernen, nachdem nicht mehr zurückgewechselt wird. Jedenfalls dürfte es einfach passiert sein, dass eine Änderung am Kompatibilitätslayer, der die neue und alte Welt zusammenhält, zu viel "gelöscht" wurde. So wurde vermutlich der Code entfernt (bzw die Bedingung verändert), der verhindert, dass die alten Servernamen angezeigt werden.

Case closed.

Licence: CC BY-NC-SA 4.0; Nithanim

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment