public ProtoVessel CreateProtoVessel() { var configNode = ConfigNodeSerializer.Deserialize(RawData, NumBytes); if (configNode == null || VesselCommon.VesselHasNaNPosition(configNode)) { LunaLog.LogError($"Received a malformed vessel from SERVER. Id {VesselId}"); VesselRemoveSystem.Singleton.KillVessel(VesselId, "Malformed vessel"); VesselRemoveSystem.Singleton.AddToKillList(VesselId, "Malformed vessel"); return(null); } var newProto = VesselSerializer.CreateSafeProtoVesselFromConfigNode(configNode, VesselId); if (newProto == null) { LunaLog.LogError($"Received a malformed vessel from SERVER. Id {VesselId}"); VesselRemoveSystem.Singleton.KillVessel(VesselId, "Malformed vessel"); VesselRemoveSystem.Singleton.AddToKillList(VesselId, "Malformed vessel"); return(null); } if (VesselCommon.ProtoVesselHasInvalidParts(newProto)) { return(null); } return(newProto); }
/// <summary> /// This method uses a lot of memory so try to call it as less as possible and only when needed /// </summary> public void DeserializeVesselBytes() { lock (_vesselDataSyncLock) { _needToDeserializeData = false; var newVesselNode = ConfigNodeSerializer.Deserialize(_vesselData, _numBytes); if (!VesselCommon.VesselHasNaNPosition(newVesselNode)) { //In case there's a deserialization error skip it and keep the older node _vesselNode = newVesselNode; } if (_vesselNode == null) { LunaLog.LogError($"Received a malformed vessel from SERVER. Id {VesselId}"); VesselRemoveSystem.Singleton.KillVessel(VesselId, "Malformed vessel"); VesselRemoveSystem.Singleton.AddToKillList(VesselId, "Malformed vessel"); return; } var newProto = VesselSerializer.CreateSafeProtoVesselFromConfigNode(_vesselNode, VesselId); //In case there's a deserialization error skip it and keep the older proto if (newProto != null) { HasInvalidParts = VesselCommon.ProtoVesselHasInvalidParts(newProto); if (newProto.vesselID != VesselId) { LunaLog.LogError($"Tried to update the Vessel with a proto from a different vessel ID. Proto: {newProto.vesselID} CorrectId: {VesselId}"); } else { _deserializedProtoVessel = newProto; } } //If protovessel is still null then unfortunately we must remove that vessel as the server sent us a bad vessel if (_deserializedProtoVessel == null) { LunaLog.LogError($"Received a malformed vessel from SERVER. Id {VesselId}"); VesselRemoveSystem.Singleton.KillVessel(VesselId, "Malformed vessel"); VesselRemoveSystem.Singleton.AddToKillList(VesselId, "Malformed vessel"); } else { _vesselParts.Clear(); foreach (var protoPart in _deserializedProtoVessel.protoPartSnapshots) { _vesselParts.TryAdd(protoPart.flightID, protoPart); } } } }