Skocz do zawartości

Dołącz do społeczności Sharegon

Odkryj świat technologii, gier i programowania w Sharegon.pl 🚀

Czy jesteś pasjonatem nowych technologii, zapalonym graczem, czy aspirującym programistą? Nasza społeczność jest miejscem dla Ciebie! Tutaj możesz dzielić się swoimi pomysłami, uczestniczyć w ekscytujących dyskusjach i uczyć się od ekspertów w dziedzinie. Zdobywaj osiągnięcia, buduj swoją reputację i rywalizuj z innymi entuzjastami.

Twoja wiedza i umiejętności mogą wzbogacić naszą społeczność. Stań się częścią Sharegon! 🧩🌐

header

Rekomendowane odpowiedzi

  • Programista

Cześć, postanowiłem napisać ten "poradnik", aby każdy wiedział mniej więcej na jakiej zasadzie działa komunikacja sieciowa w jakże pięknym kodzie źródłowym gry Metin2.

 

W poradniku omówimy jak działa komunikacja:
- Klient gry -> Serwer

- Serwer -> Klient gry
- Serwer <-> Serwer

- Serwer -> Baza danych

- Baza danych -> Serwer

 

 

Klient gry -> Serwer

Zacznijmy od utworzenia nowego pakietu, który będziemy wysyłać z klienta gry do serwera.
W tym celu przejdźmy do pliku: /UserInterface/Packet.h

Zwróćmy uwagę jak są nazwane istniejące już pakiety:

🔐 Ukryta Treść 🔐

Jak widać w "nazwie" tych pakietów zawarte jest "_CG_" oznacza to, że pakiet jest "ClientGame", czyli po prostu wysyłany z klienta gry do serwera.

 

Szukamy pierwszego wolnego ID dla naszego pakietu. U mnie będzie to 126, a zatem dodajemy:

🔐 Ukryta Treść 🔐

 

 

Okej, jeśli mamy już ustalone ID naszego pakietu to teraz pora przygotować strukturę danych, które będą przesyłane. Załóżmy, że będziemy przesyłać jakąś liczbę do serwera, a zatem dodajemy następującą strukturę:

🔐 Ukryta Treść 🔐

 

Warto w nazwie struktury (w tym przypadku SSharegonTestPacketCG) również zawrzeć typ pakietu w postaci "CG", aby później łatwiej było się odnaleźć.

 

 

Kolejnym krokiem będzie dodanie funkcji, która będzie nam wysyłała pakiet do serwera.
W tym celu przechodzimy najpierw do pliku: /UserInterface/PythonNetworkStream.h

Wyszukujemy np.:

🔐 Ukryta Treść 🔐

 

Dodajemy niżej:

🔐 Ukryta Treść 🔐

 

 

Okej, mamy zadeklarowaną już funkcję. Teraz pasowałoby napisać jej tzw. "ciało", w którym będą wykonywane odpowiednie czynności, aby wysłać pakiet.
Przechodzimy do pliku: /UserInterface/PythonNetworkStreamPhaseGame.cpp

Na samym dole pliku wklejamy "ciało" funkcji:

🔐 Ukryta Treść 🔐

 

 

Okej, prawie gotowe. Pasowałoby jeszcze jakoś wysłać ten pakiet z poziomu klienta gry. Na potrzeby tego poradnika ustawimy wysyłanie pakietu pod przycisk F5, ale najpierw musimy jeszcze dopisać nową funkcję obsługiwaną przez cudownego pythona.
Przechodzimy do pliku: /UserInterface/PythonNetworkStreamModule.cpp

Szukamy:

🔐 Ukryta Treść 🔐

 

Powyżej dodajemy:

🔐 Ukryta Treść 🔐

 

 

Następnie wyszukujemy:

🔐 Ukryta Treść 🔐

 

I dodajemy powyżej:

🔐 Ukryta Treść 🔐

 

 

Okej, kod wymagany w bince mamy gotowy. Teraz przejdziemy do odbierania tego pakietu przez serwer. Pythona zostawimy sobie na koniec 😄

 

 

 

Przechodzimy do pliku: /game/src/packet.h

Jak się pewnie domyślacie dodajemy tutaj nasze id pakietu oraz jego strukturę:

🔐 Ukryta Treść 🔐

 

 

Teraz musimy dodać nasz nowy pakiet do "listy" obsługiwanych pakietów, żeby wszystko działało jak należy.

Przechodzimy do pliku: /game/src/packet_info.cpp

Wyszukujemy:

🔐 Ukryta Treść 🔐

 

I dodajemy niżej:

🔐 Ukryta Treść 🔐

 

 

Okej, pakiet został dodany do listy obsługiwanych pakietów. Teraz pasowałoby odebrać ten pakiet przez serwer.

Przechodzimy do pliku: /game/src/input.h

Wyszukujemy np.:

🔐 Ukryta Treść 🔐

 

Niżej dodajemy:

🔐 Ukryta Treść 🔐

 

 

Funkcja zadeklarowana, pora na odbieranie pakietu i ciało funkcji.

Przechodzimy do pliku: /game/src/input_main.cpp

Szukamy:

🔐 Ukryta Treść 🔐

 

Niżej dodajemy:

🔐 Ukryta Treść 🔐

 

 

Na dole pliku dodajemy ciało funkcji:

🔐 Ukryta Treść 🔐

 

 

 

Okej teraz pora na Pythona.

Przechodzimy do pliku: game.py

Wyszukujemy:

🔐 Ukryta Treść 🔐

 

Niżej dodajemy:

🔐 Ukryta Treść 🔐

 

 

Na samym dole pliku dodajemy funkcję:

🔐 Ukryta Treść 🔐

 

 

Teraz po wejściu do gry i kliknięciu przycisku F5 powinien pojawić nam się na czat fajny komunikat 😄

 

 

 

 

Na ten moment tylko jeden rodzaj pakietu. Temat będzie aktualizowany o kolejne i postaram się jakoś bardziej przejrzyście edytować stylistykę.

Całość pisałem z pamięci (mogą wystąpić literówki), jeśli znajdziecie jakiś błąd to proszę pisać w temacie.

Edytowane przez KoYGeR
  • Lubię 35
  • Serce 6
  • Lubię 35
  • Serce 6
Odnośnik do komentarza
https://sharegon.pl/topic/781-networking-metin2-obs%C5%82uga-wszystkich-mo%C5%BCliwych-pakiet%C3%B3w/
Udostępnij na innych stronach

  • Programista
1 minutę temu, Delta napisał(a):

@KoYGeR bardzo doceniam za taki poradnik, duży props 😄

To dopiero pierwsza część poradnika. Postaram się z każdym dniem wrzucać kolejne typy pakietów

  • Serce 1
  • Serce 1
Odnośnik do komentarza
https://sharegon.pl/topic/781-networking-metin2-obs%C5%82uga-wszystkich-mo%C5%BCliwych-pakiet%C3%B3w/#findComment-6223
Udostępnij na innych stronach

@KoYGeR W Twoim poradniku znalazłem poważny problem dotyczący obsługi pakietów.

 

W funkcji SendSharegonTestPacket używasz SendSequence() co oznacza, że klient wysyła pakiety sekwencyjne:

🔐 Ukryta Treść 🔐

 

Natomiast po stronie serwera ustawiłeś obsługę tego pakietu jako false:

🔐 Ukryta Treść 🔐

 

Gdy serwer nie oczekuje sekwencji, a klient ją wysyła, serwer może niepoprawnie przetworzyć pakiet, co prowadzi do błędów takich jak "unknown packet header".

Dzieje się tak, ponieważ serwer nie wie, że w buforze jest jeszcze jeden bajt sekwencji, co powoduje niezgodności w przetwarzaniu danych.

 

Jeśli chcesz poprawnie przetwarzać pakiet musisz zsynchronizować konfigurację pakietów po obu stronach. Jeśli klient wysyła sequence to serwer musi być przygotowany do odbioru, czyli ustawiasz na true. 

🔐 Ukryta Treść 🔐
  • Lubię 10
  • Dzięki 1
  • Serce 1
  • Lubię 10
  • Dzięki 1
  • Serce 1
Odnośnik do komentarza
https://sharegon.pl/topic/781-networking-metin2-obs%C5%82uga-wszystkich-mo%C5%BCliwych-pakiet%C3%B3w/#findComment-7091
Udostępnij na innych stronach

  • Programista
7 godzin temu, Sevence napisał(a):

@KoYGeR W Twoim poradniku znalazłem poważny problem dotyczący obsługi pakietów.

 

W funkcji SendSharegonTestPacket używasz SendSequence() co oznacza, że klient wysyła pakiety sekwencyjne:

🔐 Ukryta Treść 🔐

  • 🔑 Nie zapomnij zostawić reakcji, aby podziękować autorowi za jego pracę! 👍
    💖 W ten sposób okazujemy wsparcie i doceniamy wkład każdego członka naszej społeczności. 🌸

 

Natomiast po stronie serwera ustawiłeś obsługę tego pakietu jako false:

🔐 Ukryta Treść 🔐

  • 🔑 Nie zapomnij zostawić reakcji, aby podziękować autorowi za jego pracę! 👍
    💖 W ten sposób okazujemy wsparcie i doceniamy wkład każdego członka naszej społeczności. 🌸

 

Gdy serwer nie oczekuje sekwencji, a klient ją wysyła, serwer może niepoprawnie przetworzyć pakiet, co prowadzi do błędów takich jak "unknown packet header".

Dzieje się tak, ponieważ serwer nie wie, że w buforze jest jeszcze jeden bajt sekwencji, co powoduje niezgodności w przetwarzaniu danych.

 

Jeśli chcesz poprawnie przetwarzać pakiet musisz zsynchronizować konfigurację pakietów po obu stronach. Jeśli klient wysyła sequence to serwer musi być przygotowany do odbioru, czyli ustawiasz na true. 

🔐 Ukryta Treść 🔐

  • 🔑 Nie zapomnij zostawić reakcji, aby podziękować autorowi za jego pracę! 👍
    💖 W ten sposób okazujemy wsparcie i doceniamy wkład każdego członka naszej społeczności. 🌸

To nie ma większego znaczenia, zwróć uwagę na metodę SendSequence (zwraca zawsze true, no chyba, że masz dyrektywę, która odpowiada za to). Zachowałem po prostu "styl" developerów tej pięknej gry o czym wspomniałem w komentarzu.

  • Lubię 1
  • Lubię 1
Odnośnik do komentarza
https://sharegon.pl/topic/781-networking-metin2-obs%C5%82uga-wszystkich-mo%C5%BCliwych-pakiet%C3%B3w/#findComment-7100
Udostępnij na innych stronach

Spoko rozpiska, każdy kto zabiera się za dev-a metina powinien wiedzieć jak to wygląda. Ponad 10 lat temu bez source to do komunikacji używało się cmdchatów, wtedy było ciekawie xD Skoro już wiemy jak posługiwać się pakietami to może teraz coś w stylu jak radzić sobie w przypadku wystąpienia właśnie legendarnego już syserra "unknown packet header"

Odnośnik do komentarza
https://sharegon.pl/topic/781-networking-metin2-obs%C5%82uga-wszystkich-mo%C5%BCliwych-pakiet%C3%B3w/#findComment-8956
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

×
×
  • Dodaj nową pozycję...