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:
HEADER_CG_LOGIN = 1,
HEADER_CG_ATTACK = 2,
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:
HEADER_CG_SHAREGON_TEST_PACKET = 126,
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ę:
typedefstructSSharegonTestPacketCG{
BYTE header;// nasz headerint value;// wartość którą będziemy wysyłać do serwera}TSharegonTestPacketCG;
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.:
boolSendTargetPacket(DWORD dwVID);
Dodajemy niżej:
boolSendSharegonTestPacket(int value);
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:
boolCPythonNetworkStream::SendSharegonTestPacket(int value){TSharegonTestPacketCG packet;// deklarowanie struktury naszego pakietu
packet.header = HEADER_CG_SHAREGON_TEST_PACKET;// nadawanie nagłówka
packet.value = value;// przypisywanie wartości wysyłanej do serweraif(!Send(sizeof(packet),&packet))// wysyłanie pakietu, jako parametry funkcji podajemy rozmiar naszego pakietu oraz wskaźnik do pamięci, gdzie trzymane są dane naszego pakietu{TraceError("Z jakiegos powodu nie udalo sie wyslac pakietu!");returnfalse;}returnSendSequence();// to można zastąpić zwykłym 'return true;' lub nawet całą funkcję przerobić na void, ale zachowajmy styl developerów metina :D}
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
Funkcja zadeklarowana, pora na odbieranie pakietu i ciało funkcji.
Przechodzimy do pliku: /game/src/input_main.cpp
Szukamy:
case HEADER_CG_REFINE:Refine(ch, c_pData);break;
Niżej dodajemy:
case HEADER_CG_SHAREGON_TEST_PACKET:SharegonTestPacket(ch, c_pData);break;
Na dole pliku dodajemy ciało funkcji:
voidCInputMain::SharegonTestPacket(LPCHARACTER ch,constchar* c_pData){if(!ch)// jeśli jakimś cudem nasza postać nie została znaleziona przerywamy wykonywanie funkcjireturn;TSharegonTestPacketCG* packet_data =(TSharegonTestPacketCG*) c_pData;// rzutujemy odebrane dane, na typ danych naszego pakietu
ch->ChatPacket(CHAT_TYPE_INFO,"Brawo! Udalo sie odebrac dane z klienta o wartosci: %d", packet_data->value);}
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:
HEADER_CG_LOGIN = 1, HEADER_CG_ATTACK = 2,
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:
HEADER_CG_SHAREGON_TEST_PACKET = 126,
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ę:
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.:
Dodajemy niżej:
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:
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:
Powyżej dodajemy:
Następnie wyszukujemy:
I dodajemy powyżej:
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ę:
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:
I dodajemy niżej:
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.:
Niżej dodajemy:
Funkcja zadeklarowana, pora na odbieranie pakietu i ciało funkcji.
Przechodzimy do pliku: /game/src/input_main.cpp
Szukamy:
Niżej dodajemy:
Na dole pliku dodajemy ciało funkcji:
Okej teraz pora na Pythona.
Przechodzimy do pliku: game.py
Wyszukujemy:
Niżej dodajemy:
Na samym dole pliku dodajemy funkcję:
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