Przejdź do głównej zawartości

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.

TransportAdresJak leci GMCP
telnetport 9600negocjacja IAC (opcja 201), ładunek JSON
WebSocketport 9601, ścieżka /wsramki 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.

PakietKiedyCo niesie
Ability.Cooldownużycie zdolnościstan odnowienia
Ability.Listpodgląd zdolności; ponownie po reconnect i transferze shardówpoznane zdolności z polem slot (1–5 albo 0)
Ability.Slotslogowanie i każda zmiana slotuslots — mapa "1"…"5", oraz max_slots
Account.Characterspo zalogowaniu, gdy konto ma postaciecharacters[]{id, name, race, gender, …}, max, admin
Account.LoginErrornieudane logowanie lub weryfikacjamessage
Account.RegisterErrornieudana rejestracjamessage
Account.Verifiedkonto potwierdzonepuste
Account.Verifyklient → serwer: kod weryfikacyjny; także serwer → klient jako prośba o kodod klienta code; od serwera email, message
Char.Climbingkażda zmiana stanu wspinaczkiactive, route, height, total, status, opis odcinka
Char.Combat.Stylelogowanie (z opóźnieniem) i każde walcz <styl>style i jego skutki
Char.Creationkolejny krok kreatora postacistep, prompt, options[]{value, label}
Char.Currencylogowanie i każda zmiana stanu sakiewkimithril, gold, silver, copper, total
Char.Infopo zalogowaniupodstawowe dane postaci
Char.Items.Listlogowanie i każda zmiana plecaka lub wyposażenialista przedmiotów wraz z założonymi
Char.Namepo zalogowaniu i po transferze między shardaminame, fullname
Char.Needszmiana sytości, pragnienia, zmęczeniapoziomy potrzeb
Char.Questszmiana stanu zadańaktywne zadania i ich etapy
Char.Reputationlogowanie i zmiana reputacjizones — mapa strefa → {name, level, xp, tier, …}
Char.Skillspodgląd umiejętnościpostęp każdej umiejętności
Char.Slowstart i koniec spowolnienia ruchuefektywne opóźnienie i jego źródła
Char.Statelogowanie, zmiana HP, wejście i wyjście z walkihp (skala 0–6), state — aktualizacje częściowe
Char.Statspodgląd cechsześć cech i ich doświadczenie
Char.Titleslogowanie, zmiana tytułu lub pochodzeniaearned[], active, active_name, origin
Comm.Channel.Emoteemotkichannel, talker, text
Comm.Channel.Textpowiedz i pokrewnechannel, talker, text
Core.LoginErrornieudane Core.Loginmessage — tekst błędu
Dungeon.Enterwejście do instancjidane wyprawy
Dungeon.Exitopuszczenie instancjipuste
Dungeon.Levelzmiana poziomu lochunumer poziomu
Dungeon.Roomzmiana pokoju w instancjipozycja na mapie lochu
Mining.Collapsezawał — rozsyłane do wszystkich graczy na shardziemine_id, współrzędne
Mining.Leavewyjście z kopalnipuste
Mining.Mapwejście do pokoju kopalnisiatka tuneli wokół gracza
Mining.OreFoundznalezienie rudyrodzaj i ilość
Mining.Progresskażde uderzenie kilofempostęp rozbijania ściany
Mining.Stopprzerwanie kopaniapuste
Mining.Supportwejście do kopalni oraz wzmocnij/napraw/zbadaj ścianywytrzymałość i wzmocnienie ścian nośnych
Mining.WallBrokenprzebicie ścianykierunek i nowy pokój
NPC.Dialoguerozmowa z NPCtematy i odpowiedzi
Objects.Dataspójrz, zmiana HP, start i koniec walki, zmiana zasłony, każda zmiana celu, ruchopisy obiektów wraz z polem uid — patrz ostrzeżenie o identyfikatorach niżej
Objects.Numsspójrz i wejście do pokojutablica identyfikatorów obiektów w pokoju
Room.Infospójrz i każde przejścienum, name, area, environment, exits
Room.Playersspójrz i każde przejścieplayers[]
Sea.Mapkarta morska na pokładzie łodzi: przy wejściu, przy przekroczeniu granicy kilometra, przy zmianie widoczności i przy zejściu na brzegaboard, 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.Stepkażdy krok samouczkastep (liczba albo "complete"), hint, opcjonalnie popup
World.Timezmiana pory dniaczas i faza doby
World.Weatherzmiana pogody w regioniezjawisko i jego natężenie
core.pingodpowiedź na Core.Pingpuste

Serwer reaguje tylko na te pakiety. Wszystko inne jest ignorowane.

PakietKiedy wysłaćŁadunek
Account.CreateCharacterklient → serwer: start kreatora postacipuste
Account.DeleteCharacterklient → serwer: usunięcie postacicharacter_id
Account.Impersonateklient → serwer: wejście do gry cudzą postacią (tylko konta administracyjne; serwer odmawia pozostałym)name — imię postaci
Account.Loginklient → serwer: logowanie na e-mailemail, password
Account.Registerklient → serwer: rejestracja na e-mailemail, password
Account.ResendCodeklient → serwer: wyślij kod jeszcze razpuste
Account.SelectCharacterklient → serwer: wybór postacicharacter_id
Account.Verifyklient → serwer: kod weryfikacyjny; także serwer → klient jako prośba o kodod klienta code; od serwera email, message
Char.Creationkolejny krok kreatora postacistep, prompt, options[]{value, label}
Core.Loginklient → serwer: logowanie po nazwie postaciname, password
Core.Pingklient → serwer, dowolniepuste; serwer odsyła core.ping

Klient wybiera jedną i się jej trzyma.

Po nazwie postaciCore.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-mailAccount.RegisterAccount.Verify (serwer prosi o kod) → Account.Verify z codeAccount.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ść.

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”.

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.