Użytkownik:BartoszKonkol/sandbox/Protokół serwerowy
Artykuł w budowie! Trwa budowa strony BartoszKonkol/sandbox/Protokół serwerowy.
Jej autor prosi, abyś w miarę możliwości pomógł mu przy jej tworzeniu.
|
Protokół serwerowy to sposób komunikacji serwera z klientem. Składa się on z wielu pakietów, służących do wymiany konkretnego rodzaju informacji (m.in. ilość graczy znajdujących się na serwerze, informacje o terenie mapy, aktualizacje stanu bloków, ruchy mobów, interakcje z innymi graczami/mobami/przedmiotami/blokami).
Komunikacja[edytuj | edytuj kod]
Aktywny serwer Minecraft oczekuje na połączenie z strony dowolnego gniazda TCP (w tym też klienta gry). Po uzyskaniu połączenia komunikacja odbywa się za pomocą pakietów będących ciągami bajtów. Aby rozpoznać czego dane pakiety dotyczą, posiadają one swoje identyfikatory, którymi są liczby szesnastkowe w zakresie od 0 (0x00) do 127 (0x7F). Dodatkowo, aby stwierdzić jaki typ transmisji aktualnie się odbywa, serwer i klient muszą uzgodnić stan połączenia.
Handshaking (0x00)[edytuj | edytuj kod]
Uzgadnianie stanu połączenia (ang. Handshaking) - to pakiet, który klient wysyła do serwera w celu określenia, czy zamierza uzyskać informacje o stanie serwera, czy też chce się do niego podłączyć w celu rozpoczęcia rozgrywki.
Pakiet ten korzysta z identyfikatora zerowego (0x00) oraz przesyła do serwera infomacie o używanej przez klienta wersji protokołu, adresie i porcie serwera oraz numerze stanu (1 - w celu uzyskania wyłącznie informacji o stanie serwera; 2 - w celu połączenia i zalogowania się na serwer).
Status[edytuj | edytuj kod]
Stan serwera (ang. Status) - jest to grupa pakietów wysyłanych wyłącznie wtedy, gdy w pakiecie uzgadniania stanu połączenia klient zażądał informacji o stanie serwera.
Komunikacja na tym etapie składa się z serii dwóch wzajemnie wysyłanych pakietów:
Request - Response (0x00)[edytuj | edytuj kod]
Klient wysyła do serwera pusty pakiet o zerowym identyfikatorze (0x00). W odpowiedzi (poprzez pakiet wysyłany również z identyfikatorem 0x00) otrzymuje informacje w formacie JSON zawierające takie dane, jak np. nazwę wersji serwera, numer wersji protokołu używanego przez serwer, liczbę graczy znajdujących się na serwerze, opis serwera czy ikonę serwera. Przykładowy dokument JSON:
{
"version":
{
"name":"BungeeCord 1.8",
"protocol":47
},
"players":
{
"max":100,
"online":10
},
"description":"Serwer Minecraft!"
}
Ping - Pong (0x01)[edytuj | edytuj kod]
Klient wysyła do serwera pakiet o identyfikatorze 0x01, zawierający czas systemowy klienta liczony w milisekundach. Następnie serwer odpowiada klientowi wysyłając pakiet również z identyfikatorem 0x01, zawierający identyczny numer czasu systemowego, jak ten przesłany przez klienta.
Login[edytuj | edytuj kod]
Logowanie (ang. Login) - jest to zestaw pakietów służących do rozpoczęcia rozgrywki przez gracza na serwerze. Pierwszym etapem, po uzgodnieniu stanu połączenia (jeśli wybrano dołączenie do serwera, a nie uzyskanie informacji o serwerze), jest wysłanie przez klienta do serwera pakietu Login Start. Następnie serwer wysyła do klienta pakiet Encryption Request, którego celem jest ustalenie szyfrowania pakietów podczas dalszej komunikacji. Jeśli serwer przyjmuje wyłącznie graczy którzy zakupili oryginalną wersję gry, to klient rozłączy się jeśli nie będzie w stanie rozszyfrować kluczy połączenia (nastąpi to wówczas, gdy klient nie zaloguje się z konta premium lub jeśli ma włączoną grę przez zbyt długi czas). W przypadku, gdy nastąpi prawidłowa weryfikacja kluczy, klient odeśle do serwera pakiet Encryption Response. Kolejnym krokiem będzie próba weryfikacji klienta po stronie serwera, która w przypadku niepowodzenia spowoduje wyrzucenie gracza z serwera, a w razie powodzenia spowoduje wysłanie do klienta pakietów Login Success oraz Set Compression.
Login Start (0x00)[edytuj | edytuj kod]
Jest to pakiet zaczynający procedurę logowania. Jest wysyłany przez klienta do serwera. Korzysta z zerowego identyfikatora (0x00) i przesyła wyłącznie nazwę.
Encryption Request (0x01)[edytuj | edytuj kod]
Jest to pakiet rozpoczynający szyfrowanie połączenia. Wysyłany jest przez serwer do klienta. Korzysta z identyfikatora 0x01. Przesyła numer ID serwera (przeważnie pusty), dane na temat długości klucza publicznego i sam klucz oraz informacje o długości kodu jednorazowego i ów kod jednorazowy.
Encryption Response (0x01)[edytuj | edytuj kod]
Jest to pakiet wysyłany przez klienta do serwera po udanym odszyfrowaniu klucza. Korzysta z identyfikatora 0x01. Przesyła dane na temat długości wspólnego tajnego kodu, sam wspólny tajny kod oraz rozmiar tokenu weryfikacyjnego i ów token weryfikacyjny.
Login Success (0x02)[edytuj | edytuj kod]
Jest to pakiet potwierdzający pomyślne zalogowanie na serwerze. Jest wysyłany przez serwer do klienta. Korzysta z identyfikatora 0x02. Przesyła UUID gracza oraz jego nick. Po jego dostarczeniu następuje przełączenie stanu połączenia z Login (logowanie) na Play (rozgrywka).
Set Compression (0x03)[edytuj | edytuj kod]
Jest to pakiet przesyłający jedynie dane na temat maksymalnego rozmiaru skompresowanych pakietów używanych przez dany serwer. Wysyłany jest przez serwer do klienta. Korzysta z identyfikatora 0x03.
Stan połączenia[edytuj | edytuj kod]
Stan połączenia (ang. State) - to rodzaj aktualnego typu wymiany informacji w pakietach pomiędzy serwerem a klientem.
Rozróżnia się cztery stany połączenia:
Rozgrywka[edytuj | edytuj kod]
Rozgrywka (ang. Play) - to najbardziej rozbudowany zestaw pakietów. Aktualnie składa się z 77 pakietów serwer → klient oraz 30 pakietów klient → serwer. Służy do wymiany wszelakich informacji pomiędzy serwerem a klientem, dotyczących wszystkich elementów gry.
Serwer → Klient[edytuj | edytuj kod]
Spawn Object (0x00)[edytuj | edytuj kod]
Wywoływane gdy tworzony jest pojazd lub inny obiekt.
Identyfikator pakietu: 0x00 (0)
Przesyła:
- numer identyfikacyjny danego bytu (Entity ID)
- numer UUID obiektu (Object UUID)
- numer identyfikatora obiektu (Type)
- pozycje bytu (X, Y, Z, Pitch, Yaw)
- numer określający odmianę obiektu (Data)
- kierunek i prędkość przemieszczania się bytu (Velocity X, Velocity Y, Velocity Z)
Spawn Experience Orb (0x01)[edytuj | edytuj kod]
Wywoływane gdy tworzone są kule doświadczenia.
Identyfikator pakietu: 0x01 (1)
Przesyła:
- numer identyfikacyjny danego bytu (Entity ID)
- pozycje bytu (X, Y, Z)
- ilość kul doświadczenia w grupie do zebrania (Count)
Spawn Global Entity (0x02)[edytuj | edytuj kod]
Wywoływane gdy w pobliżu (do 512 kratek od) gracza uderzy piorun.
Identyfikator pakietu: 0x02 (2)
Przesyła:
- numer identyfikacyjny danego bytu (Entity ID)
- rodzaj zdarzenia (Type) - aktualnie zawsze wynosi 1
- miejsce uderzenia błyskawicy (X, Y, Z)
Spawn Mob (0x03)[edytuj | edytuj kod]
Wywoływane gdy tworzony jest mob.
Identyfikator pakietu: 0x03 (3)
Przesyła:
- numer identyfikacyjny danego bytu (Entity ID)
- numer UUID bytu (Entity UUID)
- numer identyfikatora moba (Type)
- pozycje bytu (X, Y, Z, Yaw, Pitch, Head Pitch)
- kierunek i prędkość przemieszczania się bytu (Velocity X, Velocity Y, Velocity Z)
- metadane moba (Metadata)
Spawn Painting (0x04)[edytuj | edytuj kod]
Wywoływane gdy tworzony jest obraz.
Identyfikator pakietu: 0x04 (4)
Przesyła:
- numer identyfikacyjny danego bytu (Entity ID)
- numer UUID bytu (Entity UUID)
- tytuł obrazu, o maksymalnej długości trzynastu znaków (Title)
- współrzędne środka obrazu (Location)
- numer kierunku zwrotu namalowanej części obrazu (Direction)
- 0 - południe
- 1 - zachód
- 2 - północ
- 3 - wschód
Spawn Player (0x05)[edytuj | edytuj kod]
Wywoływane gdy inny gracz wchodzi w zakres widzialny przez klienta.
Identyfikator pakietu: 0x05 (5)
Przesyła:
- numer identyfikacyjny danego gracz (Entity ID)
- numer UUID gracza (Player UUID)
- pozycje gracza (X, Y, Z, Yaw, Pitch)
- metadane gracza (Metadata)
Animation (0x06)[edytuj | edytuj kod]
Wywoływane gdy powinna nastąpić zmiana animacji gracza.
Identyfikator pakietu: 0x06 (6)
Przesyła:
- numer identyfikacyjny danego gracz (Entity ID)
- numer rodzaju nowej animacji (Animation)
- 0 - odchylenie głównego ramienia
- 1 - otrzymanie obrażeń
- 2 - wychodzenie z łóżka
- 3 - odchylenie drugiego ramienia
- 4 - efekt krytycznego ataku
- 5 - magiczny efekt krytycznego ataku
Statistics (0x07)[edytuj | edytuj kod]
Wywoływane gdy nastąpi zmiana statystyk.
Identyfikator pakietu: 0x07 (7)
Przesyła:
- wielkość tablicy (Count)
- tablicę składającą się, na każdym poziomie, z nazwy statystyki oraz jej wartości (Statistic : Name & Value)
Block Break Animation (0x08)[edytuj | edytuj kod]
Wywoływane gdy następuje wyświetlenie animacji niszczenia bloku.
Identyfikator pakietu: 0x08 (8)
Przesyła:
- identyfikator bytu niszczenia bloku (Entity ID)
- współrzędne bloku (Location)
- stopień zniszczenia (Destroy Stage) - liczba z zakresu od 0 do 9
Update Block Entity (0x09)[edytuj | edytuj kod]
Wywoływane gdy następuje zmiana stanu bytu bloku.
Identyfikator pakietu: 0x09 (9)
Przesyła:
- współrzędne bloku (Location)
- numer rodzaju akcji zmiany stanu (Action)
- 1 - ustawienie rodzaju moba tworzącego się w spawnerze
- 2 - ustawienie tekst aktualnej i ostatniej treści komendy w bloku poleceń
- 3 - ustawienie podstawowego i ostatniego poziomu mocy magicznej latarni
- 4 - ustawienie rotacji i wyglądu głowy
- 5 - ustawienie rodzaju kwiatu znajdującego się w doniczce
- 6 - ustawienie koloru i wzoru znajdującego się na banerze
- 7 - ustawienie danych struktury bytu bloku
- 8 - ustawienie miejsca docelowego dla bloku portalu bramy Kresu
- 9 - ustawienie tekstu tabliczki
- opcjonalny tag NBT bytu bloku (NBT Data) - jeśli nie zawiera tagu, przesyła wartość TAG_END(0)
Block Action (0x0A)[edytuj | edytuj kod]
Wywoływane gdy nastąpi:
- otwarcie lub zamknięcie skrzyni
- aktywowanie lub dezaktywowanie tłoku
- wydobycie dźwięku z bloku dźwiękowego
- zmiana stanu magicznej latarni
Identyfikator pakietu: 0x0A (10)
Przesyła:
- współrzędne bloku (Location)
- numery charakteryzujące typ akcji (Byte 1, Byte 2)
- przykładowo, dla akcji skrzyni parametr pierwszy nie jest używany i zawsze wynosi 1, natomiast parametr drugi określa, czy skrzynia ma zostać zamknięta (0), czy otwarta (1)
- numer identyfikatora bloku (Block Type)
Block Change (0x0B)[edytuj | edytuj kod]
Wywoływane podczas zmiany bloku w obszarze renderowania.
Identyfikator pakietu: 0x0B (11)
Przesyła:
- współrzędne bloku (Location)
- nowy identyfikator bloku (Block ID)
Boss Bar (0x0C)[edytuj | edytuj kod]
Wywoływane gdy wyświetlić się ma pasek życia bossa.
Identyfikator pakietu: 0x0C (12)
Przesyła:
- numer UUID paska (UUID)
- numer rodzaju akcji paska (Action) - od tego numeru zależą pozostałe przesyłane dane
- 0 - tworzenie paska
- tytuł paska (Title)
- poziom wypełnienia paska (Health) - wartość od 0.0 do 1.0 (wyższy poziom spowoduje stworzenie kolejnego paska wypełnionego w połowie)
- numer koloru paska (Color) - wartości kolorów można zobaczyć poniżej
- numer odpowiadający ilości podziałów paska (Division) - wartości podziałów można zobaczyć poniżej
- numer maski bitowej (Flags) - wartości masek bitowych można zobaczyć poniżej
- 1 - usuwanie paska
- nie przesyła żadnych dodatkowych danych
- 2 - aktualizacja poziomu wypełniania paska
- poziom wypełnienia paska (Health) - wartość od 0.0 do 1.0 (wyższy poziom spowoduje stworzenie kolejnego paska wypełnionego w połowie)
- 3 - aktualizacja tytułu paska
- tytuł paska (Title)
- 4 - aktualizacja stylu paska
- numer koloru paska (Color) - wartości kolorów można zobaczyć poniżej
- numer odpowiadający ilości podziałów paska (Dividers) - wartości podziałów można zobaczyć poniżej
- 5 - aktualizacja maski bitowej paska
- numer maski bitowej (Flags) - wartości masek bitowych można zobaczyć poniżej
- 0 - tworzenie paska
Numer | Nazwa | Kolor | Wygląd |
---|---|---|---|
0 | Różowy (Pink) |
||
1 | Niebieski (Blue) |
||
2 | Czerwony (Red) |
||
3 | Zielony (Green) |
||
4 | Żółty (Yellow) |
||
5 | Fioletowy (Purple) |
||
6 | Biały (White) |
Numer | Nazwa | Opis |
---|---|---|
0 | SOLID | bez podziału |
1 | SEGMENTED_6 | podział na 6 części |
2 | SEGMENTED_10 | podział na 10 części |
3 | SEGMENTED_12 | podział na 12 części |
4 | SEGMENTED_20 | podział na 20 części |
Numer | Nazwa | Opis |
---|---|---|
0 | brak efektów | |
1 | DARKEN_SKY | przyciemnia niebo (jak podczas walki z Witherem) |
2 | PLAY_BOSS_MUSIC | uruchamia muzykę Smoka Kresu |
CREATE_FOG | tworzy mgłę dookoła świata | |
3 | wszystkie efekty jednocześnie |
Server Difficulty (0x0D)[edytuj | edytuj kod]
Wywoływane gdy w menu gry klienta ma wystąpić zmiana poziomu trudności.
Identyfikator pakietu: 0x0D (13)
Przesyła:
- numer poziomu trudności (Difficulty)
- 0 - pokojowy (peaceful)
- 1 - łatwy (easy)
- 2 - normalny (normal)
- 3 - trudny (hard)
Tab-Complete (0x0E)[edytuj | edytuj kod]
Wywoływane jako odpowiedź serwera z automatycznie uzupełnianą resztą treści komendy.
W większości przypadków odpowiada uzupełnieniem nazwy gracza (np. po wpisaniu _j i kliknięciu TAB zostanie uzupełniony tekst do _jeb - jeśli w danym momencie na serwerze znajduje się gracz o takim nick'u), lecz obsługuje też nazwy poleceń i parametry.
Identyfikator pakietu: 0x0E (14)
Przesyła:
- wielkość tablicy (Count)
- tablicę składającą się, na każdym poziomie, z pojedynczych, wysyłanych oddzielnie komend (Matches)
Chat Message (0x0F)[edytuj | edytuj kod]
Wywoływane gdy wyświetlić się ma wiadomość na chat'cie.
Identyfikator pakietu: 0x0F (15)
Przesyła:
- sformatowaną wiadomość o maksymalnej długości 32 767 (
2^15-1
) bajtów (JSON Data) - sposoby formatowania można zobaczyć poniżej - numer miejsca wyświetlenia wiadomości (Position)
- 0 - zwykła wiadomość wyświetlana w oknie chat'u (chat)
- 1 - wiadomość systemowa wyświetlana w oknie chat'u (system message)
- 2 - wiadomość wyświetlana na HUD'zie powyżej pasku zdrowia/pancerza/głodu/powietrza (above hotbar)
Formatowanie wiadomości chat'u[edytuj | edytuj kod]
Wiadomości wyświetlane na chat'cie przesyłane są w formacie JSON, o następującej, przykładowej składni:
(treść poprzedzona znakami //
stanowi komentarz i sama w sobie nie istnieje w transmitowanej wiadomości)
{
// pierwszy poziom tekstu
"text": "Na serwerze pojawił się gracz ",
// lub, korzystając z tłumaczeń dostępnych po stronie klienta
"translate": "multiplayer.player.joined",
// dodanie koloru
// (kolor szary)
"color": "gray",
// dodanie tego składnika spowoduje dołączenie do pierwszego poziomu tekstu dodatkowych poziomów
"extra":
[
// drugi poziom
{
// dołączanie tekstu drugiego poziomu do tekstu pierwszego poziomu
"text": "Notch",
// lub, korzystając z selektora (tj. @p, @a, @e, @r)
// (@p oznacza najbliższego gracza względem osoby, do której wysyłana jest ta wiadomość)
"selector": "@p",
// dodanie pogrubienia
"bold": true,
// zdarzenie które ma się wywołać po kliknięciu na tekst drugiego poziomu
"clickEvent":
{
// określenie nazwy akcji (tj. open_url, open_file, run_command, suggest_command)
"action": "open_url",
// parametr akcji
// (zdefiniowanie adresu McWikiPL jako uruchamiającego się po kliknięciu na tekst drugiego poziomu)
"value": "http://mcwiki.pl/"
}
},
// trzeci poziom
{
// dołączanie tekstu trzeciego poziomu do tekstu pierwszego i drugiego poziomu
"text": "!",
// usunięcie pogrubienia dziedziczonego po drugim poziomie
"bold": false,
// dodanie koloru
// (kolor czerwony)
"color": "red"
}
]
}
Powyższa treść wyświetli na chat'cie przykładowo:Na serwerze pojawił się gracz Notch!
Klient → Serwer[edytuj | edytuj kod]
Identyfikator bytów[edytuj | edytuj kod]
Identyfikator bytów - to numer odnoszący się w pakietach protokołu rozgrywki do mobów i obiektów.
Identyfikator mobów[edytuj | edytuj kod]
Identyfikator mobów - to numer określający danego moba, zgodnie z następującą listą:
Identyfikator | Mob |
---|---|
48 | niezdefiniowany mob |
49 | niezdefiniowany mob agresywny |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
120 |
Identyfikator obiektów[edytuj | edytuj kod]
Identyfikator obiektów - to numer określający dany obiekt, zgodnie z następującą listą:
Identyfikator | Obiekt |
---|---|
1 | |
2 | Przedmiot |
3 | Obszar efektów chmur |
10 | |
10.1 | |
11 | |
10.2 | |
12 | |
10.3 | |
10.4 | Wagonik ze spawnerem potworów |
10.5 | |
10.6 | |
50 | |
51 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | Pocisk Withera |
67 | Pocisk Shulkera |
70 | Spadające obiekty |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
90 | |
91 | Strzała z miksturą |
92 | |
93 |
Wersje[edytuj | edytuj kod]
Poniżej znajdują się rozpisane wszystkie wersje nowego protokołu serwerowego wraz z odpowiadającymi im wersjami gry:[1]
Linki zewnętrzne[edytuj | edytuj kod]
Przypisy[edytuj | edytuj kod]
- ↑ zestawienie stworzono w oparciu o zasoby serwera Rhenowar, będącego własnością Polish Games Studio (mc.polishgames.net)
- ↑ dostęp: 2016-06-22