Files
K-C-Multiplayer/README.md
2025-12-14 16:33:45 +01:00

12 KiB

Kingdoms and Castles Multiplayer Mod - Bug Tracker

Ismert hibak / Known Issues

KRITIKUS - Server/Connection Problems

Hiba Status Megjegyzes
Server nem all le amikor host kilep menube Meg nincs elkezdve Host menu-be megy, de server tovabb fut es fogadja a packeteket a klienstol
Kliens nem lesz kidobva host kilepesekor Meg nincs elkezdve Kliens tovabb jatszik miutan host kiment, nem kap ertesitest
Packetek erkeznek menu-ben Meg nincs elkezdve Menu-ben is fogadja es feldolgozza a packeteket, ami nem helyes
Rossz kapcsolat, "server disconnected" hibak Reszben javitva Event handler duplikacio es session cleanup javitva
StartGame.Start() NullReferenceException Meg nincs elkezdve MainMenuMode.StartGame crash-el 2x a logban, TargetInvocationException

Building Placement Errors (output.txt-bol) - KRITIKUS!

Hiba Status Megjegyzes
PlayerAddBuildingHook NullReferenceException Meg nincs elkezdve 56 PLACEMENT START, csak 1 PLACEMENT END! Szinte minden epulet fail-el. A hook 1-11 szamokat printeli majd crash
IndexOutOfRangeException WorldPlace-ben Meg nincs elkezdve 9 elofordulas - "Index was outside the bounds of the array"
Epuletek nem jelennek meg kliensnel Vizsgalat alatt A fenti hibak miatt 55/56 epulet NEM kerul elhelyezesre!

Host-Client Sync Problems

Hiba Status Megjegyzes
Jatek ujrainditasa szukseges lobby/save valtas utan Reszben javitva Session cleanup hozzaadva LobbyManager-ben
Utak/epuletek nem toltenek be helyesen vagy atfednek Vizsgalat alatt UpdateMaterialSelection() es UpdateRotation() hozzaadva
Eroforrasok nem mentenek/toltenek helyesen Meg nincs elkezdve
NPC-k veletlenszeruen megallnak es nem mozognak load utan Vizsgalat alatt TeleportTo problema javitva, BakePathing hozzaadva
Orientaciok (rotaciok) nem szinkronizalodnak Reszben javitva Rotation es localPosition kozvetlenul alkalmazva WorldPlace-ben
Host torol valamit -> kliens nem latja Meg nincs elkezdve BuildingDestroy packet szukseges
Host nem latja a kliens epuleteit helyesen (rossz texturak) Javitva UpdateMaterialSelection() hozzaadva WorldPlace.cs-ben

Gameplay Bugs

Hiba Status Megjegyzes
Tobb Keep ugyanarra a szigetre Meg nincs elkezdve Engedi hogy masik jatekos szigetere Keep-et rakjunk, igy az eredeti jatekos elveszti a Keep-jet es nem tudja mozgatni az embereit

Status Definiciok

  • Javitva: A hiba javitva lett es tesztelve
  • Reszben javitva: Javitas megkezdve, de meg nem teljes
  • Vizsgalat alatt: Debug logging hozzaadva, vizsgaljuk a problemat
  • Meg nincs elkezdve: A hiba ismert, de meg nem kezdtuk el javitani

Log Analisis (2024-12-14 15:39-15:56)

Hibak szamokban

  • 56 BUILDING PLACEMENT START - epulet elhelyezesi kiserlet
  • 1 BUILDING PLACEMENT END - sikeres elhelyezes
  • 55 FAIL (98%) - majdnem minden epulet elbukik!
  • 55 "Error in add building hook" - NullReferenceException
  • 9 IndexOutOfRangeException - tomb tulindexeles
  • 2 StartGame.Start() crash - TargetInvocationException
  • 2 Client disconnect event - kapcsolat megszakadas

Idovonal

  • 15:39: Session start
  • 15:40:03: Exception MainMenuMode.StartGame - NullReferenceException (1.)
  • 15:42:14: Client disconnect events (ketszer)
  • 15:44:11: Ujabb Exception MainMenuMode.StartGame (2.)
  • 15:45-15:50: 55x "Error in add building hook" - szinte minden epulet fail
  • 15:52:00: Utolso BuildingStatePacket erkezik client 2-tol, utana csak ServerSettings
  • 15:53:55: Host kilep menube ("Menu set to: Menu")
  • 15:53:55-15:56:25: Server TOVABB FUT es fogadja a packeteket a klienstol!
  • 15:56:27: Server vegre leall

Fo problemak a logbol

  1. PlayerAddBuildingHook.Prefix crash-el 55x - valami null benne (1-11 szamokat printel elotte)
  2. Server nem all le menu-nel - 2.5 percig meg fut miutan host kiment
  3. Kliens nem kap ertesitest - tovabb kuldi a packeteket
  4. StartGame exception - 2x crash jatek inditaskor

Recent Changes

2024-12-14

  • Advanced sync logging hozzaadva [SYNC] prefix-szel
  • Building placement reszletes logging (minden property)
  • Packet send/receive logging
  • Building state update logging

Korabbi javitasok

  • KCServer.cs: Event handler duplikacio javitas
  • 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

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:

// 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:

// 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:

    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:

    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:

    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:

// 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:
    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

Következő lépések

  1. Ellenőrizni, hogy a PlayerAddBuildingHook null-ellenőrzései végig lefutnak, mielőtt az adatokat használjuk.
  2. Biztosítani, hogy a Server.Stop() meghívódik, amikor a játékos visszalép a menübe (TransitionToHook).
  3. Bővíteni a WorldPlace és a LandMassNames tömbök védelmét, hogy ne okozzon indexhiba az épület-telepítés során.