z client_disconnect jest dość różnie... Samo rozłączenie faktycznie nie następuje, ale client_disconnect przed zmianą mapy się wykonuje, tak samo client_connect po zmianie. Brak faktycznego rozłączenia daje m.in to, że przy zmianie mapy nas nie wyrzuci z serwera, bo ktoś się "wbił" na nasz slot, a serwer jest pełny. Jednak jest kilka wyjątków.
1. Gdy gracz potrzebuje pobrać jakieś pliki, a serwer posiada fastdownload, właściwe rozłączenie i ponowne połączenie nastąpi.
2. Czasem client_disconnect się nie wywołuje, zauważyłem że ma wpływ tutaj to, jak długo serwer zmienia mapę. Jednak plugin_end wywołuje się po wszystkich client_disconnect i w nim próba pobrania graczy zwróci tylko tych, dla których client_diconnect się nie wywołał. Możemy więc tam w razie czego dokończyć swoje "dyrdymały" na graczu. Pamiętać trzeba jednak, że w plugin_end kategorycznie nie wykonujemy zapytań do bazy danych przez ThreadQuery. Tak samo w client_disconnect tego nie powinniśmy robić, gdyż jeśli zapytanie się nie wykona przed zmianą mapy, może zostać "zgubione", co nie tylko pozbawi nas możliwości podglądnięcia jego wyniku ale też doprowadzić może do wycieków pamięci i błędów typu Thread worker was unable to start!
W client_disconnect nie polecam wykonywać żadnych zapytań, lepiej je zostawić do plugin_end i wykonać metodą nie-threaded
Ewentualnie wrzucić task wykonujący się co X czasu, który będzie zapisywał wszystkie rzeczy z client_disconnect.