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:
- Client: Verbindung aufbauen (per TCP/IP und Apache MINA Version 2.0.0-RC1 )
- Client: Benutzername und Passwort senden (Server führt auth gegen GForge durch)
- Server: Fail und disconnect oder Success und …
- Server: Aktueller Zustand der Spielwelt
- 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
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
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) |