GMCP — protokół dla klientów
GMCP (Generic Mud Communication Protocol) to strukturalny kanał obok zwykłego tekstu. Serwer wysyła nim dane, których nie trzeba parsować z opisów: stan postaci, zawartość pokoju, ekwipunek, pogodę.
Ta strona jest dla osób piszących klienta albo skrypty. Do grania nie jest potrzebna.
Jak się połączyć
Dział zatytułowany „Jak się połączyć”| Transport | Adres | Jak leci GMCP |
|---|---|---|
| telnet | port 9600 | negocjacja IAC (opcja 201), ładunek JSON |
| WebSocket | port 9601, ścieżka /ws | ramki JSON, bez negocjacji |
Na telnecie klient musi zgłosić obsługę GMCP w negocjacji — bez tego serwer nie wyśle ani jednego pakietu. Połączenie WebSocket ma GMCP włączone od razu.
Nazwa pakietu i ładunek są rozdzielone: pakiet to tekst w rodzaju
Char.State, ładunek to obiekt JSON.
Serwer → klient (48)
Dział zatytułowany „Serwer → klient (48)”| Pakiet | Kiedy | Co niesie |
|---|---|---|
Ability.Cooldown | użycie zdolności | stan odnowienia |
Ability.List | podgląd zdolności; ponownie po reconnect i transferze shardów | poznane zdolności z polem slot (1–5 albo 0) |
Ability.Slots | logowanie i każda zmiana slotu | slots — mapa "1"…"5", oraz max_slots |
Account.Characters | po zalogowaniu, gdy konto ma postacie | characters[] — {id, name, race, gender, …}, max, admin |
Account.LoginError | nieudane logowanie lub weryfikacja | message |
Account.RegisterError | nieudana rejestracja | message |
Account.Verified | konto potwierdzone | puste |
Account.Verify | klient → serwer: kod weryfikacyjny; także serwer → klient jako prośba o kod | od klienta code; od serwera email, message |
Char.Climbing | każda zmiana stanu wspinaczki | active, route, height, total, status, opis odcinka |
Char.Combat.Style | logowanie (z opóźnieniem) i każde walcz <styl> | style i jego skutki |
Char.Creation | kolejny krok kreatora postaci | step, prompt, options[] — {value, label} |
Char.Currency | logowanie i każda zmiana stanu sakiewki | mithril, gold, silver, copper, total |
Char.Info | po zalogowaniu | podstawowe dane postaci |
Char.Items.List | logowanie i każda zmiana plecaka lub wyposażenia | lista przedmiotów wraz z założonymi |
Char.Name | po zalogowaniu i po transferze między shardami | name, fullname |
Char.Needs | zmiana sytości, pragnienia, zmęczenia | poziomy potrzeb |
Char.Quests | zmiana stanu zadań | aktywne zadania i ich etapy |
Char.Reputation | logowanie i zmiana reputacji | zones — mapa strefa → {name, level, xp, tier, …} |
Char.Skills | podgląd umiejętności | postęp każdej umiejętności |
Char.Slow | start i koniec spowolnienia ruchu | efektywne opóźnienie i jego źródła |
Char.State | logowanie, zmiana HP, wejście i wyjście z walki | hp (skala 0–6), state — aktualizacje częściowe |
Char.Stats | podgląd cech | sześć cech i ich doświadczenie |
Char.Titles | logowanie, zmiana tytułu lub pochodzenia | earned[], active, active_name, origin |
Comm.Channel.Emote | emotki | channel, talker, text |
Comm.Channel.Text | powiedz i pokrewne | channel, talker, text |
Core.LoginError | nieudane Core.Login | message — tekst błędu |
Dungeon.Enter | wejście do instancji | dane wyprawy |
Dungeon.Exit | opuszczenie instancji | puste |
Dungeon.Level | zmiana poziomu lochu | numer poziomu |
Dungeon.Room | zmiana pokoju w instancji | pozycja na mapie lochu |
Mining.Collapse | zawał — rozsyłane do wszystkich graczy na shardzie | mine_id, współrzędne |
Mining.Leave | wyjście z kopalni | puste |
Mining.Map | wejście do pokoju kopalni | siatka tuneli wokół gracza |
Mining.OreFound | znalezienie rudy | rodzaj i ilość |
Mining.Progress | każde uderzenie kilofem | postęp rozbijania ściany |
Mining.Stop | przerwanie kopania | puste |
Mining.Support | wejście do kopalni oraz wzmocnij/napraw/zbadaj ściany | wytrzymałość i wzmocnienie ścian nośnych |
Mining.WallBroken | przebicie ściany | kierunek i nowy pokój |
NPC.Dialogue | rozmowa z NPC | tematy i odpowiedzi |
Objects.Data | spójrz, zmiana HP, start i koniec walki, zmiana zasłony, każda zmiana celu, ruch | opisy obiektów wraz z polem uid — patrz ostrzeżenie o identyfikatorach niżej |
Objects.Nums | spójrz i wejście do pokoju | tablica identyfikatorów obiektów w pokoju |
Room.Info | spójrz i każde przejście | num, name, area, environment, exits |
Room.Players | spójrz i każde przejście | players[] |
Sea.Map | karta morska na pokładzie łodzi: przy wejściu, przy przekroczeniu granicy kilometra, przy zmianie widoczności i przy zejściu na brzeg | aboard, rows[] (. woda, # ląd, @ przystań, ? poza zasięgiem wzroku, poza mapą; stałe płótno 17×17), origin_gx/gy, vis_km, compass, wind, you (gx/gy/col/row/heading/sure), docks[] |
Tutorial.Step | każdy krok samouczka | step (liczba albo "complete"), hint, opcjonalnie popup |
World.Time | zmiana pory dnia | czas i faza doby |
World.Weather | zmiana pogody w regionie | zjawisko i jego natężenie |
core.ping | odpowiedź na Core.Ping | puste |
Klient → serwer (11)
Dział zatytułowany „Klient → serwer (11)”Serwer reaguje tylko na te pakiety. Wszystko inne jest ignorowane.
| Pakiet | Kiedy wysłać | Ładunek |
|---|---|---|
Account.CreateCharacter | klient → serwer: start kreatora postaci | puste |
Account.DeleteCharacter | klient → serwer: usunięcie postaci | character_id |
Account.Impersonate | klient → serwer: wejście do gry cudzą postacią (tylko konta administracyjne; serwer odmawia pozostałym) | name — imię postaci |
Account.Login | klient → serwer: logowanie na e-mail | email, password |
Account.Register | klient → serwer: rejestracja na e-mail | email, password |
Account.ResendCode | klient → serwer: wyślij kod jeszcze raz | puste |
Account.SelectCharacter | klient → serwer: wybór postaci | character_id |
Account.Verify | klient → serwer: kod weryfikacyjny; także serwer → klient jako prośba o kod | od klienta code; od serwera email, message |
Char.Creation | kolejny krok kreatora postaci | step, prompt, options[] — {value, label} |
Core.Login | klient → serwer: logowanie po nazwie postaci | name, password |
Core.Ping | klient → serwer, dowolnie | puste; serwer odsyła core.ping |
Dwie ścieżki logowania
Dział zatytułowany „Dwie ścieżki logowania”Klient wybiera jedną i się jej trzyma.
Po nazwie postaci — Core.Login z name i password.
Błąd wraca jako Core.LoginError. Gdy konto ma więcej postaci, serwer
odsyła Account.Characters.
Po koncie e-mail — Account.Register → Account.Verify (serwer
prosi o kod) → Account.Verify z code → Account.Verified.
Potem Account.Login, a dalej Account.SelectCharacter albo
Account.CreateCharacter. Kreator prowadzi Char.Creation:
serwer podaje step, prompt i listę options, klient odsyła
wybraną wartość.
Uwaga o identyfikatorach obiektów
Dział zatytułowany „Uwaga o identyfikatorach obiektów”To jest miejsce, w którym najłatwiej napisać klienta, który wygląda dobrze i nie działa.
Objects.Data niesie dla każdego obiektu pole uid — i tylko ta
wartość jest rozumiana przez serwer w komendach typu weź czy
zabij. Wygląda jak ob_miecz_42 dla przedmiotów i NPC.
Jeżeli twój klient trzyma własną numerację obiektów, musisz podmienić ją na
uid tuż przed wysłaniem komendy, a nie wcześniej — inaczej gracz
zobaczy w oknie sensowne „zaatakuj rozbójnika”, a serwer odpowie
„Nie widzisz tu takiej osoby”.
Aktualizacje częściowe
Dział zatytułowany „Aktualizacje częściowe”Char.State bywa wysyłany z częścią pól. Klient powinien scalać
przychodzące dane ze swoim stanem, a nie podmieniać go w całości — inaczej
brakujące pole wyzeruje ci pasek życia.