Compare commits
2 Commits
6e16be8646
...
02af5c8c68
| Author | SHA1 | Date | |
|---|---|---|---|
| 02af5c8c68 | |||
| c6c60a7e07 |
17
Main.cs
17
Main.cs
@@ -550,7 +550,12 @@ namespace KCM
|
|||||||
{
|
{
|
||||||
public static bool Prefix(Player __instance)
|
public static bool Prefix(Player __instance)
|
||||||
{
|
{
|
||||||
if (KCClient.client.IsConnected && __instance.gameObject.name.Contains("Client Player") && !LobbyManager.loadingSave)
|
var localPlayer = Player.inst;
|
||||||
|
if (KCClient.client.IsConnected &&
|
||||||
|
__instance != null &&
|
||||||
|
(localPlayer == null || __instance != localPlayer) &&
|
||||||
|
__instance.gameObject != null &&
|
||||||
|
__instance.gameObject.name.Contains("Client Player"))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -1206,6 +1211,7 @@ namespace KCM
|
|||||||
if (KCServer.IsRunning)
|
if (KCServer.IsRunning)
|
||||||
{
|
{
|
||||||
Main.helper.Log("Trying to load multiplayer save");
|
Main.helper.Log("Trying to load multiplayer save");
|
||||||
|
KCM.StateManagement.Observers.StateObserver.ClearAll();
|
||||||
LoadSave.LastLoadDirectory = path;
|
LoadSave.LastLoadDirectory = path;
|
||||||
path = path + "/" + filename;
|
path = path + "/" + filename;
|
||||||
|
|
||||||
@@ -1453,11 +1459,12 @@ namespace KCM
|
|||||||
Main.helper.Log(e.Message);
|
Main.helper.Log(e.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool flag2 = building.GetComponent<Keep>() != null && building.TeamID() == p.PlayerLandmassOwner.teamId;
|
var keep = building.GetComponent<Keep>();
|
||||||
Main.helper.Log("Set keep? " + flag2);
|
bool shouldSetKeep = keep != null && p.keep == null;
|
||||||
if (flag2)
|
Main.helper.Log("Set keep? " + shouldSetKeep);
|
||||||
|
if (shouldSetKeep)
|
||||||
{
|
{
|
||||||
p.keep = building.GetComponent<Keep>();
|
p.keep = keep;
|
||||||
Main.helper.Log(p.keep.ToString());
|
Main.helper.Log(p.keep.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using KCM.StateManagement.Observers;
|
||||||
using static KCM.Main;
|
using static KCM.Main;
|
||||||
|
|
||||||
namespace KCM.Packets.Lobby
|
namespace KCM.Packets.Lobby
|
||||||
@@ -41,6 +42,8 @@ namespace KCM.Packets.Lobby
|
|||||||
loadingSave = true;
|
loadingSave = true;
|
||||||
received = 0;
|
received = 0;
|
||||||
|
|
||||||
|
StateObserver.ClearAll();
|
||||||
|
|
||||||
saveData = new byte[saveSize];
|
saveData = new byte[saveSize];
|
||||||
chunksReceived = new bool[totalChunks];
|
chunksReceived = new bool[totalChunks];
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ A mellékelt log (`output.txt`) alapján több tipikus hiba okozta a szerver ind
|
|||||||
- `NullReferenceException` a lobby player UI frissítésében (`PlayerEntryScript.SetValues`)
|
- `NullReferenceException` a lobby player UI frissítésében (`PlayerEntryScript.SetValues`)
|
||||||
- duplikált SteamID miatti `ArgumentException: same key already added` a handshake során
|
- duplikált SteamID miatti `ArgumentException: same key already added` a handshake során
|
||||||
- csomagkezelés közben `KeyNotFoundException` / `NullReferenceException` (hiányzó `clientId -> steamId` map, race/állapot problémák)
|
- csomagkezelés közben `KeyNotFoundException` / `NullReferenceException` (hiányzó `clientId -> steamId` map, race/állapot problémák)
|
||||||
|
- Save/load utani desync: a kliens oldali "Client Player" Reset nem futott mentés betöltése közben (loading flag miatt), így remote player állapot (registry/field/worker) beragadhatott; ez okozhatott "nem látni az aratást/elszállítást", hiányzó épület/resource state, és UI anomáliákat.
|
||||||
|
- Save/load utani "kezdo keep" kerese: betöltéskor a keep beallitasa túl szigorúan teamId-hez volt kötve, ezért előfordult hogy a kliensnél nem lett beállítva a már létező keep, és újra kérte a játék a kezdő lerakást.
|
||||||
|
- Többszöri load után romló sync: a statikus StateObserver/observer GameObject-ok nem lettek kitakarítva új load előtt, így régi világ/objektum referenciák maradhattak bent és rossz state frissítéseket küldhettek.
|
||||||
|
|
||||||
## Mit javít ez a verzió?
|
## Mit javít ez a verzió?
|
||||||
|
|
||||||
@@ -22,6 +25,9 @@ A mellékelt log (`output.txt`) alapján több tipikus hiba okozta a szerver ind
|
|||||||
- `FieldSystem` `Player.inst` referenciáinak patch-elése (farm/termés állapotkezelés több helyen erre támaszkodik)
|
- `FieldSystem` `Player.inst` referenciáinak patch-elése (farm/termés állapotkezelés több helyen erre támaszkodik)
|
||||||
- Mentés betöltéskor a `ProcessBuilding` útvonal kiegészítése `World.inst.PlaceFromLoad(...)` + `UnpackStage2(...)` hívásokkal (különösen fontos a “világba helyezés” mellékhatásai miatt, pl. farm/field regisztráció)
|
- Mentés betöltéskor a `ProcessBuilding` útvonal kiegészítése `World.inst.PlaceFromLoad(...)` + `UnpackStage2(...)` hívásokkal (különösen fontos a “világba helyezés” mellékhatásai miatt, pl. farm/field regisztráció)
|
||||||
- Save transfer kliens oldalon robusztusabb inicializálás/reset (ne ragadjon be a statikus állapot több betöltés után, plusz bounds/null ellenőrzések)
|
- Save transfer kliens oldalon robusztusabb inicializálás/reset (ne ragadjon be a statikus állapot több betöltés után, plusz bounds/null ellenőrzések)
|
||||||
|
- Fix: save/load közben is lefut a remote "Client Player" Reset (nem csak új világ generálásnál), hogy a player alrendszerek mindig tiszta alapból induljanak.
|
||||||
|
- Fix: keep detektálás betöltéskor (ne teamId egyezésen múljon), így nem kéri a játék a kezdő keep lerakását, ha már létezik.
|
||||||
|
- Fix: új load előtt StateObserver takarítás (save transfer kezdetén, host oldali `LoadAtPath` elején, lobby elhagyásakor), hogy ne maradjanak beragadt observer objektumok.
|
||||||
- Kompatibilitási fix: `World.inst.liverySets` lista esetén `.Count` használata `.Length` helyett (különben `Compilation failed` lehet egyes verziókon)
|
- Kompatibilitási fix: `World.inst.liverySets` lista esetén `.Count` használata `.Length` helyett (különben `Compilation failed` lehet egyes verziókon)
|
||||||
- Hálózati stabilitás: `BuildingStatePacket` most `Unreliable` módban megy (state jellegű csomagoknál jobb, ha a legfrissebb állapot érkezik meg és nem torlódik fel a megbízható sor)
|
- Hálózati stabilitás: `BuildingStatePacket` most `Unreliable` módban megy (state jellegű csomagoknál jobb, ha a legfrissebb állapot érkezik meg és nem torlódik fel a megbízható sor)
|
||||||
- Mentés-szinkron stabilitás: szerver oldalon a save chunkok már nem egy nagy for-ciklusban mennek ki, hanem ütemezve (csökkenti a “The gap between received sequence IDs…” / “Poor connection” diszkonnekteket)
|
- Mentés-szinkron stabilitás: szerver oldalon a save chunkok már nem egy nagy for-ciklusban mennek ki, hanem ütemezve (csökkenti a “The gap between received sequence IDs…” / “Poor connection” diszkonnekteket)
|
||||||
@@ -42,6 +48,8 @@ A mellékelt log (`output.txt`) alapján több tipikus hiba okozta a szerver ind
|
|||||||
- `RiptideSteamTransport/LobbyManager.cs`
|
- `RiptideSteamTransport/LobbyManager.cs`
|
||||||
- `Packets/Handlers/PacketHandler.cs`
|
- `Packets/Handlers/PacketHandler.cs`
|
||||||
- `Packets/State/BuildingStatePacket.cs`
|
- `Packets/State/BuildingStatePacket.cs`
|
||||||
|
- `StateManagement/Observers/StateObserver.cs`
|
||||||
|
- `Main.cs`
|
||||||
|
|
||||||
## Telepítés / használat
|
## Telepítés / használat
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using KCM;
|
using KCM;
|
||||||
using KCM.Enums;
|
using KCM.Enums;
|
||||||
using KCM.Packets.Handlers;
|
using KCM.Packets.Handlers;
|
||||||
|
using KCM.StateManagement.Observers;
|
||||||
using Steamworks;
|
using Steamworks;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
@@ -157,6 +158,8 @@ namespace Riptide.Demos.Steam.PlayerHosted
|
|||||||
if (KCClient.client.IsConnected)
|
if (KCClient.client.IsConnected)
|
||||||
KCClient.client.Disconnect();
|
KCClient.client.Disconnect();
|
||||||
|
|
||||||
|
StateObserver.ClearAll();
|
||||||
|
|
||||||
Main.helper.Log("clear players");
|
Main.helper.Log("clear players");
|
||||||
Main.kCPlayers.Clear();
|
Main.kCPlayers.Clear();
|
||||||
Main.clientSteamIds.Clear();
|
Main.clientSteamIds.Clear();
|
||||||
|
|||||||
@@ -12,6 +12,24 @@ namespace KCM.StateManagement.Observers
|
|||||||
{
|
{
|
||||||
public static Dictionary<int, IObserver> observers = new Dictionary<int, IObserver>();
|
public static Dictionary<int, IObserver> observers = new Dictionary<int, IObserver>();
|
||||||
|
|
||||||
|
public static void ClearAll()
|
||||||
|
{
|
||||||
|
foreach (var observer in observers.Values)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var component = observer as Component;
|
||||||
|
if (component != null)
|
||||||
|
UnityEngine.Object.Destroy(component.gameObject);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
observers.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
public static void RegisterObserver<T>(T instance, string[] monitoredFields, EventHandler<StateUpdateEventArgs> eventHandler = null, EventHandler<StateUpdateEventArgs> sendUpdateHandler = null)
|
public static void RegisterObserver<T>(T instance, string[] monitoredFields, EventHandler<StateUpdateEventArgs> eventHandler = null, EventHandler<StateUpdateEventArgs> sendUpdateHandler = null)
|
||||||
{
|
{
|
||||||
if (observers.ContainsKey(instance.GetHashCode()))
|
if (observers.ContainsKey(instance.GetHashCode()))
|
||||||
|
|||||||
Reference in New Issue
Block a user