# Kingdoms and Castles Multiplayer Mod Ez a mod multiplayer funkcionalitást ad a Kingdoms and Castles játékhoz. ## Legutóbbi javítások (2025-12-14) ### Kapcsolati problémák javítása #### Probléma A játékosok gyakran tapasztaltak "poor connection", "lost connection", vagy "server disconnected" üzeneteket, és ezután nem tudtak újra csatlakozni anélkül, hogy újraindították volna a játékot. #### Gyökérok 1. **Statikus client/server objektumok**: A `KCClient` és `KCServer` osztályok statikus konstruktorokban létrehozott `Client` és `Server` objektumokat használtak, amelyek soha nem újrainizializálódtak disconnect után. 2. **Event handler elvesztés**: Az event handlerek (Connected, Disconnected, MessageReceived, stb.) a statikus konstruktorban lettek feliratkozva, de amikor új server/client objektumok lettek létrehozva, ezek a handlerek elvesztek. 3. **Nem tisztított állapot**: A disconnect után a játék állapota nem lett teljesen kitisztítva, így a következő kapcsolódási kísérlet hibás állapotból indult. #### Megoldások ##### 1. KCClient.cs - Javított újracsatlakozási képesség **Változtatások:** - Új `InitializeClient()` metódus amely: - Teljesen kitisztítja a régi client objektumot - Lecsatlakoztatja a régi kapcsolatot ha létezik - Leiratkozik az összes event handlerről - Létrehoz egy új, tiszta `Client` objektumot - Növelt timeout (15 másodperc) a gyakori timeout-ok elkerülésére - Újra feliratkozik az event handlerekre - Módosított `Connect()` metódus: - Minden kapcsolódás előtt újrainicializálja a client-et - Növelt connection attempts (10) a megbízhatóbb kapcsolódásért - Javított `Client_Disconnected` event handler: - Tisztítja a client state-et (clientSteamIds) - Megkülönbözteti az önkéntes és nem várt disconnect-eket - Csak nem várt disconnect esetén mutat error modalt **Érintett kód részletek:** ```csharp // KCClient.cs:34-62 private static void InitializeClient() { // Clean up old client if exists if (client != null) { if (client.IsConnected || client.IsConnecting) { client.Disconnect(); } // Unsubscribe from old events client.Connected -= Client_Connected; client.ConnectionFailed -= Client_ConnectionFailed; client.Disconnected -= Client_Disconnected; client.MessageReceived -= PacketHandler.HandlePacket; } // Create new client instance client = new Client(Main.steamClient); // Set a higher timeout to prevent frequent disconnections client.TimeoutTime = 15000; // 15 seconds instead of default 5 seconds // Subscribe to events client.Connected += Client_Connected; client.ConnectionFailed += Client_ConnectionFailed; client.Disconnected += Client_Disconnected; client.MessageReceived += PacketHandler.HandlePacket; } ``` ##### 2. KCServer.cs - Javított server event handling **Változtatások:** - Új `InitializeServer()` metódus hasonló logikával mint a client: - Leállítja a régi server-t ha fut - Leiratkozik az event handlerökről - Létrehoz új server objektumot - Növelt timeout (15 másodperc) - Újra feliratkozik az event handlerekre - Event handlerek kiszervezése statikus metódusokba: - `OnClientConnected()` - külön metódus a client csatlakozás kezelésére - `OnClientDisconnected()` - külön metódus a client lecsatlakozás kezelésére - Try-catch blokkok a biztonságos error handling-ért - `StartServer()` mindig újrainicializálja a server-t: - Garantálja a tiszta állapotot minden indításkor **Érintett kód részletek:** ```csharp // KCServer.cs:30-56 private static void InitializeServer() { // Clean up old server if exists if (server != null) { if (server.IsRunning) { server.Stop(); } // Unsubscribe from old events server.MessageReceived -= PacketHandler.HandlePacketServer; server.ClientConnected -= OnClientConnected; server.ClientDisconnected -= OnClientDisconnected; } // Create new server instance server = new Server(Main.steamServer); // Set a higher timeout to prevent frequent disconnections server.TimeoutTime = 15000; // 15 seconds instead of default 5 seconds // Subscribe to events server.MessageReceived += PacketHandler.HandlePacketServer; server.ClientConnected += OnClientConnected; server.ClientDisconnected += OnClientDisconnected; } ``` ##### 3. LobbyManager.cs - Javított cleanup **Változtatások:** - `LeaveLobby()` metódus teljes átírása: - Részletes logging minden lépésnél - Null-safe ellenőrzések - Try-catch blokk a biztonságos cleanup-ért - Kitisztítja mind a `kCPlayers` mind a `clientSteamIds` dictionary-ket - Visszaállítja az összes flag-et (`loadingSave`, `registerServer`) - Garantálja hogy mindig visszatér a ServerBrowser-hez még hiba esetén is **Érintett kód részletek:** ```csharp // LobbyManager.cs:151-205 public void LeaveLobby() { Main.helper.Log("LeaveLobby called - cleaning up connection state"); try { // Disconnect client first if (KCClient.client != null && (KCClient.client.IsConnected || KCClient.client.IsConnecting)) { Main.helper.Log("Disconnecting client..."); KCClient.client.Disconnect(); } // Stop server if running if (KCServer.IsRunning) { Main.helper.Log("Stopping server..."); KCServer.server.Stop(); } // Leave Steam lobby if (lobbyId.IsValid()) { Main.helper.Log("Leaving Steam lobby..."); SteamMatchmaking.LeaveLobby(lobbyId); } // Clear player data Main.helper.Log("Clearing player data..."); Main.kCPlayers.Clear(); Main.clientSteamIds.Clear(); // Clear UI LobbyHandler.ClearPlayerList(); LobbyHandler.ClearChatEntries(); // Reset flags ServerBrowser.registerServer = false; loadingSave = false; // ... continues with transition } catch (Exception ex) { // Error handling with fallback } } ``` ### Eredmények Ezekkel a változtatásokkal a következő problémák lettek megoldva: 1. ✅ **Reconnect képesség**: A játékosok most már tudnak újra csatlakozni disconnect után anélkül, hogy újraindítanák a játékot 2. ✅ **Timeout problémák csökkentése**: A 15 másodperces timeout jelentősen csökkenti a "poor connection" üzeneteket 3. ✅ **Tiszta állapot**: Minden disconnect után teljesen kitisztított állapotból indul az új kapcsolódás 4. ✅ **Event handler stabilitás**: Az event handlerek most már nem vesznek el újrainicializálás során 5. ✅ **Jobb error handling**: Try-catch blokkok és részletes logging a problémák könnyebb diagnosztizálásához ### Korábbi javítások #### Map szinkronizáció javítás (c4eb7e9) - Javítva: A client-ek rossz map paraméterekkel generáltak világot - Megoldás: WorldSeed packet most tartalmazza az összes szükséges map paramétert (size, type, rivers) #### StartGame NullReferenceException javítás (fc467f4) - Javítva: NullReferenceException a multiplayer játék indításakor - Megoldás: Eltávolítva a MainMenuMode.StartGame() reflection hívás, közvetlen átmenet playing mode-ba ## Telepítés 1. Másold a mod fájljait a Kingdoms and Castles mod mappájába 2. Aktiváld a modot a játék mod menüjében 3. Indítsd újra a játékot ## Használat ### Server létrehozása 1. Főmenü -> Multiplayer 2. Create Server 3. Állítsd be a szerver beállításokat 4. Várd meg, hogy a játékosok csatlakozzanak ### Csatlakozás serverhez 1. Főmenü -> Multiplayer 2. Válaszd ki a servert a listából 3. Kattints a "Join" gombra ## Ismert problémák Jelenleg nincsenek ismert kritikus problémák. Ha hibát találsz, kérlek jelentsd a fejlesztőknek. ## Fejlesztői megjegyzések ### Debugging A mod részletes loggolást tartalmaz, amely segít a problémák diagnosztizálásában. A logok a következő helyeken jelennek meg: - `[WORLD SYNC]` prefix: World generation szinkronizációs események - `LeaveLobby called` - `Lobby cleanup completed`: Disconnect/cleanup folyamat ### Hozzájárulás Ha szeretnél hozzájárulni a mod fejlesztéséhez, pull request-eket szívesen fogadunk! ## Licensz Ez a mod a Riptide Networking library-t használja, amely MIT licensz alatt áll.