using System; using System.Collections; using System.Collections.Generic; using System.Linq; using NitroxClient.Communication; using NitroxClient.Communication.Abstract; using NitroxClient.GameLogic.InitialSync.Abstract; using NitroxModel.DataStructures.GameLogic; using NitroxModel.Packets; using NitroxModel_Subnautica.DataStructures; namespace NitroxClient.GameLogic.InitialSync; public sealed class PdaInitialSyncProcessor : InitialSyncProcessor { public PdaInitialSyncProcessor() { AddDependency(); } // The steps are ordered like their call order in Player.OnProtoDeserialize public override List> Steps { get; } = [ RestoreKnownTech, RestorePDALog, RestoreEncyclopediaEntries, RestorePDAScanner ]; private static IEnumerator RestoreKnownTech(InitialPlayerSync packet) { List knownTech = packet.PDAData.KnownTechTypes.Select(techType => techType.ToUnity()).ToList(); HashSet analyzedTech = new(packet.PDAData.AnalyzedTechTypes.Select(techType => techType.ToUnity())); Log.Info($"Received initial sync packet with {knownTech.Count} KnownTech.knownTech types and {analyzedTech.Count} KnownTech.analyzedTech types."); using (PacketSuppressor.Suppress()) { KnownTech.Deserialize(knownTech, analyzedTech); } yield break; } private static IEnumerator RestorePDALog(InitialPlayerSync packet) { List logEntries = packet.PDAData.PDALogEntries; Log.Info($"Received initial sync packet with {logEntries.Count} pda log entries"); using (PacketSuppressor.Suppress()) { // We just need the timestamp and the key because everything else is provided by PDALog.InitDataForEntries PDALog.Deserialize(logEntries.ToDictionary(m => m.Key, m => new PDALog.Entry() { timestamp = m.Timestamp })); } yield break; } private static IEnumerator RestoreEncyclopediaEntries(InitialPlayerSync packet) { List entries = packet.PDAData.EncyclopediaEntries; Log.Info($"Received initial sync packet with {entries.Count} encyclopedia entries"); using (PacketSuppressor.Suppress()) { // We don't do as in PDAEncyclopedia.Deserialize because we don't persist the entry's fields which are useless foreach (string entry in entries) { PDAEncyclopedia.Add(entry, false); } } yield break; } private static IEnumerator RestorePDAScanner(InitialPlayerSync packet) { InitialPDAData pdaData = packet.PDAData; PDAScanner.Data data = new() { fragments = pdaData.ScannerFragments.ToDictionary(m => m.ToString(), m => 1f), partial = pdaData.ScannerPartial.Select(entry => entry.ToUnity()).ToList(), complete = new HashSet(pdaData.ScannerComplete.Select(techType => techType.ToUnity())) }; PDAScanner.Deserialize(data); yield break; } }