From 10d20e29ad133d568f7e007f23e42b6441fc60ab Mon Sep 17 00:00:00 2001 From: devbeni Date: Sun, 14 Dec 2025 16:11:48 +0100 Subject: [PATCH] =?UTF-8?q?K=C3=B3dban=20tal=C3=A1lhat=C3=B3=20KRITIKUS=20?= =?UTF-8?q?hib=C3=A1k=20r=C3=A9szletes=20dokument=C3=A1ci=C3=B3ja?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A README-ben leírt bugok pontos helyének és okának meghatározása a kódbázisban, javítási javaslatokkal: DOKUMENTÁLT HIBÁK: 1. Server nem áll le menüváltáskor - Hely: KCServer.cs (hiányzó logika) - Ok: OnApplicationQuit csak app bezáráskor hívódik - Javítás: TransitionToHook-ban server.Stop() hívás 2. PlayerAddBuildingHook NullReferenceException (LEGKRITIKUSABB) - Hely: Main.cs:764 - Ok: landMassBuildingRegistry.data[landMass] null/hibás indexelés - Eredmény: 55/56 épület fail (98%!) - Javítás: NULL check + array méret ellenőrzés 3. IndexOutOfRangeException WorldPlace-ben - Hely: WorldPlace.cs:167-168 - Ok: LandMassNames tömb túl kicsi - Okozó: #2 hiba miatt building nem adódik hozzá → tömb nem nő - Javítás: Védekező kód + #2 javítása ÖSSZEFÜGGÉSEK: A három hiba cascade failure-t okoz: server fut menüben → packeteket fogad → building placement fail (#2) → IndexOutOfRange (#3) → 98% épület nem jelenik meg! 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- README.md | 190 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 189 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 719af39..4c9eefc 100644 --- a/README.md +++ b/README.md @@ -86,4 +86,192 @@ - LobbyManager.cs: Session cleanup (clientSteamIds, loadingSave) - WorldPlace.cs: Building guid duplikacio check, rotation/localPosition fix - AddVillagerPacket.cs: Villager position sync + duplikacio check -- Main.cs: BakePathing() hozzaadva PlayerAddBuildingHook-ban \ No newline at end of file +- Main.cs: BakePathing() hozzaadva PlayerAddBuildingHook-ban + +--- + +## Kód Hibák Részletes Dokumentációja + +> **FIGYELEM**: Ez a szekció a kódban található hibák részletes elemzését tartalmazza. +> A hibák **NEM** lettek javítva, csak dokumentálva vannak a pontos hellyel és javítási javaslatokkal. + +### 1. KRITIKUS: Server nem áll le amikor host kilép menübe + +**Fájl**: `KCServer.cs` +**Hiba helye**: Hiányzik a logika - nincs kód ami leállítaná a servert menüváltáskor +**Kapcsolódó kód**: +- `KCServer.cs:110-122` - `OnApplicationQuit()` metódus (csak alkalmazás bezáráskor hívódik) +- `Main.cs:334-346` - `TransitionToHook` (detektálja a menü változást, de nem reagál rá) + +**Probléma részletesen**: +```csharp +// KCServer.cs:110-122 +private void OnApplicationQuit() +{ + if (server != null && server.IsRunning) + { + new ShowModal { ... }.SendToAll(); + server.Stop(); + } +} +``` + +- A server CSAK akkor áll le, ha az alkalmazás teljesen bezár (`OnApplicationQuit`) +- Amikor a host menübe lép (pl. `MainMenuMode.State.Menu`), a `TransitionToHook` észleli a változást +- DE nincs kód ami meghívná a `server.Stop()`-ot +- Eredmény: server tovább fut és fogadja a packeteket, kliens nem kap értesítést + +**Hol kell javítani**: +1. **Opció A**: `Main.cs:334-346` - TransitionToHook Prefix metódusban + - Ellenőrizni kell: ha `newState == MainMenuMode.State.Menu` ÉS `KCServer.IsRunning` + - Akkor hívni: `KCServer.server.Stop()` és értesíteni a klienseket + +2. **Opció B**: `KCServer.cs` - új metódus hozzáadása + - Létrehozni egy `StopServer()` metódust ami értesíti a klienseket és leállítja a servert + - Ezt meghívni a `TransitionToHook`-ból amikor menübe lép a host + +**Miért kritikus**: +- Kliens nem tudja, hogy a host kilépett +- Server erőforrásokat pazarol +- Packetek feldolgozása menüben hibákhoz vezet + +--- + +### 2. KRITIKUS: PlayerAddBuildingHook NullReferenceException + +**Fájl**: `Main.cs` +**Hiba helye**: `Main.cs:764` +**Érintett kód**: +```csharp +// Main.cs:755-764 +var globalBuildingRegistry = __instance.GetType().GetField("globalBuildingRegistry", ...).GetValue(__instance) as ArrayExt; +LogStep(); // 7 +var landMassBuildingRegistry = __instance.GetType().GetField("landMassBuildingRegistry", ...).GetValue(__instance) as ArrayExt; +LogStep(); // 8 +var unbuiltBuildingsPerLandmass = __instance.GetType().GetField("unbuiltBuildingsPerLandmass", ...).GetValue(__instance) as ArrayExt>; +LogStep(); // 9 (utolsó amit elér) + +__instance.AddToRegistry(globalBuildingRegistry, b); +LogStep(); // 10 (sosem éri el) +__instance.AddToRegistry(landMassBuildingRegistry.data[landMass].registry, b); // <-- CRASH ITT (line 764) +``` + +**Probléma részletesen**: +- A README szerint: **56 PLACEMENT START, csak 1 PLACEMENT END** → 55/56 épület fail +- LogStep() 1-11-ig printeli (de legtöbbször csak 1-9-ig jut el) +- A crash valószínűleg itt: `landMassBuildingRegistry.data[landMass].registry` +- **Lehetséges okok**: + 1. `landMassBuildingRegistry` null + 2. `landMassBuildingRegistry.data` null + 3. `landMassBuildingRegistry.data[landMass]` null (IndexOutOfRange) + 4. `landMassBuildingRegistry.data[landMass].registry` null + +**Hol kell javítani**: `Main.cs:755-774` + +**Javítási javaslatok**: +1. **NULL check hozzáadása** minden reflection művelet után: + ```csharp + var landMassBuildingRegistry = __instance.GetType()...GetValue(__instance) as ArrayExt<...>; + if (landMassBuildingRegistry == null) { + Main.helper.Log("ERROR: landMassBuildingRegistry is null!"); + return false; + } + ``` + +2. **Array méret ellenőrzés**: + ```csharp + if (landMass >= landMassBuildingRegistry.data.Length) { + Main.helper.Log($"ERROR: landMass={landMass} >= array length={landMassBuildingRegistry.data.Length}"); + return false; + } + ``` + +3. **Registry inicializálás ellenőrzés**: + ```csharp + if (landMassBuildingRegistry.data[landMass] == null || + landMassBuildingRegistry.data[landMass].registry == null) { + // Inicializálni vagy hibát logolni + } + ``` + +**Kapcsolódó hiba**: Ez a hiba okozza a WorldPlace IndexOutOfRangeException-t is (lásd lent) + +--- + +### 3. KRITIKUS: IndexOutOfRangeException WorldPlace-ben + +**Fájl**: `Packets/Game/GameWorld/WorldPlace.cs` +**Hiba helye**: `WorldPlace.cs:167-168` +**Érintett kód**: +```csharp +// WorldPlace.cs:113 +player.inst.AddBuilding(building); // <-- Meghívja PlayerAddBuildingHook-ot (ami crash-el) + +// WorldPlace.cs:167-168 +player.inst.LandMassNames[building.LandMass()] = player.kingdomName; // <-- CRASH ITT +Player.inst.LandMassNames[building.LandMass()] = player.kingdomName; +``` + +**Probléma részletesen**: +- A README szerint: **9 IndexOutOfRangeException** - "Index was outside the bounds of the array" +- **Ok-okozati lánc**: + 1. `WorldPlace.PlaceBuilding()` hívja `player.inst.AddBuilding(building)` (line 113) + 2. Ez triggereli a `PlayerAddBuildingHook.Prefix` metódust + 3. A hook crash-el NullReferenceException-nel (fenti #2 hiba) + 4. A try-catch elkapja (Main.cs:779-786), DE a building NEM kerül helyesen hozzáadásra + 5. A `WorldPlace.cs` folytatódik és megpróbálja indexelni: `LandMassNames[building.LandMass()]` + 6. **HA** a `LandMassNames` tömb nem inicializálva vagy túl kicsi → **IndexOutOfRangeException** + +**Hol kell javítani**: +1. **Elsődleges**: `Main.cs:764` - Javítani a PlayerAddBuildingHook-ot (lásd #2) +2. **Másodlagos**: `WorldPlace.cs:167-168` - Védekező kód: + ```csharp + int landMass = building.LandMass(); + + // Biztosítani hogy a LandMassNames tömb elég nagy + while (player.inst.LandMassNames.Count <= landMass) { + player.inst.LandMassNames.Add(""); + } + while (Player.inst.LandMassNames.Count <= landMass) { + Player.inst.LandMassNames.Add(""); + } + + player.inst.LandMassNames[landMass] = player.kingdomName; + Player.inst.LandMassNames[landMass] = player.kingdomName; + ``` + +**Miért kritikus**: Ez a hiba miatt **55/56 épület NEM kerül elhelyezésre** a kliensnél! + +--- + +### Összefüggések + +A három hiba összefügg: + +``` +1. Host menübe lép + → Server NEM áll le (#1 hiba) + → Server tovább fogad packeteket + +2. Kliens épületet helyez + → WorldPlace packet érkezik + → PlaceBuilding() meghívódik + → AddBuilding() triggereli PlayerAddBuildingHook-ot + → Hook crash-el NullReferenceException (#2 hiba) + → Building nem adódik hozzá helyesen + +3. WorldPlace folytatódik + → LandMassNames[landMass] indexelés + → IndexOutOfRangeException (#3 hiba) + → Épület NEM jelenik meg +``` + +**Eredmény**: 98% fail rate az épület elhelyezésben! + +--- + +### Javítási prioritás + +1. **#2 - PlayerAddBuildingHook** (LEGFONTOSABB) - Ez okozza a cascade failure-t +2. **#3 - WorldPlace IndexOutOfRange** - Védekező kód hozzáadása +3. **#1 - Server leállítás** - UX javítás, erőforrás kezelés \ No newline at end of file