Kódban található KRITIKUS hibák részletes dokumentációja
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 <noreply@anthropic.com>
This commit is contained in:
188
README.md
188
README.md
@@ -87,3 +87,191 @@
|
|||||||
- WorldPlace.cs: Building guid duplikacio check, rotation/localPosition fix
|
- WorldPlace.cs: Building guid duplikacio check, rotation/localPosition fix
|
||||||
- AddVillagerPacket.cs: Villager position sync + duplikacio check
|
- AddVillagerPacket.cs: Villager position sync + duplikacio check
|
||||||
- Main.cs: BakePathing() hozzaadva PlayerAddBuildingHook-ban
|
- 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<Player.BuildingRegistry>;
|
||||||
|
LogStep(); // 7
|
||||||
|
var landMassBuildingRegistry = __instance.GetType().GetField("landMassBuildingRegistry", ...).GetValue(__instance) as ArrayExt<Player.LandMassBuildingRegistry>;
|
||||||
|
LogStep(); // 8
|
||||||
|
var unbuiltBuildingsPerLandmass = __instance.GetType().GetField("unbuiltBuildingsPerLandmass", ...).GetValue(__instance) as ArrayExt<ArrayExt<Building>>;
|
||||||
|
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
|
||||||
Reference in New Issue
Block a user