Byteprotokoll des Light and Shadow Servers (update)

Software Engineering I, WS0910

Jede Gruppe wird einen Decoder für das Byteprotokoll des Servers entwickeln (und Apache MINA Version 2.0.0-RC1 benutzen). Dabei liegt dem Protokoll folgende Sendereihenfolge zu Grunde:

  1. Client: Verbindung aufbauen (per TCP/IP und Apache MINA Version 2.0.0-RC1 )
  2. Client: Benutzername und Passwort senden (Server führt auth gegen GForge durch)
  3. Server: Fail und disconnect oder Success und …
  4. Server: Aktueller Zustand der Spielwelt
  5. Server: Event basierte Changes

Anmerkung: Wenn der Client ungültige Pakete sendet werden sie verworfen und es erfolgt keine Antwort vom Server (spart ressourcen). Wer also keine Antwort bekommt hat einen ungültigen Request geschickt und sollte die Struktur der Bytenachricht überprüfen.

Das Byteprotokoll selbst hat folgenden Aufbau:

Nachrichtenformat

Länge der Nachricht (short) Nachricht

Nachricht

Typ (Untertyp) (weitere Daten)
Typ (Byte)

CREATE 0
UPDATE 1
DELETE 2
LOGIN 7
LOGINFAILED 8
LOGINSUCCESS 9
CHAT = 0x0C

Untertyp (Byte)

FIELD 0
CITY 1
RELIGION 2
RESOURCE 3
WORKER 4
GOD 5
SPELLCAST 6
FFECT 0x0A
FIELDHEALTH 0x0E
ACHIEVEMENT 0x0D

Datentypen

BigInteger
Länge (Byte) Wert (ByteStream)

Anmerkung: dem letzten Aufkommen eines BigInteger geht keine Längenangabe voraus. Sie kann aus der Länge des Pakets berechnet werden.

Int
Wert (4)
String
Länge (Int) Wert (ByteStream)

Anmerkung: dem letzten Aufkommen eines Strings geht keine Längenangabe voraus. Sie kann aus der Länge des Pakets berechnet werden. (Ausnahme: Der Login erwartet für beide Strings eine Längenangabe)

Nachrichten vom Server zum Client

String
Länge (byte) Wert (ByteStream)

Anmerkung: dem letzten Aufkommen eines Strings geht keine Längenangabe voraus. Sie kann aus der Länge des Pakets berechnet werden. Bei Nachrichten vom Server an den Client sind die Längenangaben zum String  1byte um Resourcen zu sparen.

Login: Success
LOGINSUCCESS (9) RELIGIONID (BigInteger)
Login: Failed
LOGINFAILED (8)
CreateField
CREATE (0) FIELD (0) PosX (Int) PosY (Int) RECIPEID (Int) Time (Int) OWNERID (BigInteger) ID (BigInteger)
CreateCity
CREATE (0) CITY (1) Capital(1 byte (1=true/0=false)) ID (BigInteger) PosX (Int) PosY (Int) RECIPEID (Int) Name (String) OWNERID (BigInteger)
UpdateCity
UPDATE (1) CITY (1) OWNERID (BigInteger) CITYID (BigInteger)
CreateReligion
CREATE (0) RELIGION (2) ID (BigInteger) Name (String)
CreateResource
CREATE (0) RESOURCE (3) AMOUNT (BigInteger) Type (String) FieldID (BigInteger)
CreateWorker
CREATE (0) WORKER (4) ID (BigInteger) FIELDID (BigInteger) OWNERID (BigInteger)
CreateAchievment
CREATE (0) ACHIEVMENT (0x0D) Points (int) ReligionID (ID) Name (String)
UpdateWorker
UPDATE (1) WORKER (4) ID (BigInteger) FIELDID (BigInteger) Time (Int)
CreateGod
CREATE (0) GOD (5) Name (String) RELIGIONID (BigInteger) GODID (BigInteger)
CreateSpellcast
CREATE (0) SPELLCAST (6) TYPE (INT) PosX (INT) PosY (INT) God (id)
DeleteObject
DELETE (2) TYP (BYTE) ID (BigInteger)
Chat
Chat (0x0C) Chatmessage (String)
UpdateFieldHealth
UPDATE (1) FIELDHEALTH (0x0E) Health (Byte) Fieldid (BigInteger)
CreateEffect
CREATE (0) EFFECT (0x0A) Type (Int) Religion (BigInt) FieldID (BigInt) ID (BigInt)

Nachrichten vom Client zum Server

Login
LOGIN (7) Username (String) Passwort (String)

Anmerkung: Beim Login geht beiden Strings eine Längenangabe voraus. In allen anderen Paketen lässt sich die Länge des letzen Datums durch die Länge des Pakets berechnen.

Anmerkung: Die Logindaten für die GUI Clients entsprechen den GForge Benutzernamen. Es können also maximal so viele GUI Clients für eine Gruppe gestartet werden wie sie mitglieder hat. Der KI Account Login entspricht dem Gruppennamen, das Paßwort wird euch vom Betreuer mitgeteilt bzw, solltet ihr es erfragen wenn das noch nicht passiert ist.

CreateField
CREATE (0) FIELD (0) PosX (Int) PosY (Int) RecipeID (Int) OWNERID (BigInteger)
CreateSpellcast
CREATE (0) SPELLCAST (6) Type (Int) PosX (Int) PosY (Int) Charge (BigInt)

Anmerkung: bei nicht Aufladbaren Zaubern bitte einem BigInteger mit dem Wert 0 übergeben

Chat
Chat (0x0C) Chatmessage (String)
UpdateWorker
UPDATE (1) WORKER (4) ID (BigInteger) FIELDID (BigInteger)