Z ciekawości dorwałem binarkę serwera GMP na jakimś chomiku. Binarka, lista funkcji i dwa zdisasemblowane cuda:
http://monk.4programmers.net/pub/research/.gothic/gmpserver.zipNie wgłębiałem się w szczegóły. Wystarczy zajrzeć do tego, żeby pierdolnąć soczystego facepalma, a że namiętnie używa funkcji z biblioteki standardowej i importów z HawkNLa to kod powinien być zrozumiały dla większości. Użyto najpopularniejszego wśród gimbusów wzorca projektowego, więc programowania
jednofunkcyjnego. Sztuka ta polega na otwarciu edytora, najebaniu kodu gdzie popadnie i skompilowaniu tak powstałej w bólach aplikacji.
Cała inicjalizacja sieci, odczyt konfiguracji i obsługa konsoli została sprytnie upakowana do
int main(). Na każdego gracza przypada osobny wątek serwera, który w trybie blokującym oczekuje na pakiety od danego osobnika. I tu do akcji wkracza procedura roboczo nazwana
_procHandleClient(), która prezentuje się niczym kret z kijem od miotły wsadzonym w dupę. Funkcja ta waży 12KB kodu maszynowego(!), co daje przynajmniej 2 razy tyle kodu. Dla wizualizacji: to tyle, ile by zajmował wyraz "kretyn" napisany około 4100 razy. Odpowiada za odbieranie i odpowiadanie na "pakiety" gracza. Całą komunikację realizuje ta jedna funkcja zawierająca gigantyczny switch. Jeśli dobrze widzę, to użytkownik nie otrzyma *ŻADNYCH* danych od serwera zanim o nie nie poprosi - to mogła być przyczyna zjebanej synchronizacji na płaszczyźnie klient<>serwer, a głupie tłumaczenia teamu GMP i portowanie aplikacji nowy silnik sieciowy (bezcelowo, żaden bajer im nie uratuje tyłka, jeśli go poprawnie nie użyją) po prostu aktem nieporadności.
Oprócz wymienionego wyżej burdelu zauważyłem ledwo trzy małe funkcje (możliwe że jeszcze jakieś niezbyt istotne pominąłem) - ładowanie banów, zapisywanie banów i pobieranie informacji z serwera lobby.gothic-multiplayer.com. Cała reszta to czysta klepanka. Istną plakietką "Polacy tu byli" są bezbłędnie przetłumaczone na angielski komunikaty:
Banned person tryied to join server!
Banned person tryied to join server!
%d joined to battle! Now we have %d players.
Timeout. ID:%d aka %s disconnected. %d players has been in server now.
Someone check our number of players.
Przy takim wyglądzie sprawy ciężko żeby serwer nie był podatny na cheaty, skoro ślepo wierzy informacjom podawanym przez graczy, tym samym brakuje synchronizacji poszczególnych graczy, a teoretycznie martwy gracz (tak jak to gdzieś w komentarzach czytałem) może biegać po mapie i zabijać wszystkich bez konsekwencji - serwer łyknie każdy kit.
Post pisany na szybko, sporo detali brakuje, mam nadzieję, że ogólny kształt tego burdelu został wyraźnie ukazany. Jakieś oficjalne stanowisko teamu GMP aka "wyjebaliśmy własną stronę i udajemy głuchych"?