/// <summary> /// Updates the proto vessel with the values we received about a part module change /// </summary> private static void UpdateProtoVesselFileWithNewPartSyncUiFieldData(Classes.Vessel vessel, VesselPartSyncUiFieldMsgData msgData) { var part = vessel.GetPart(msgData.PartFlightId); if (part != null) { var module = part.GetSingleModule(msgData.ModuleName); if (module != null) { switch (msgData.FieldType) { case PartSyncFieldType.Boolean: module.UpdateValue(msgData.FieldName, msgData.BoolValue.ToString(CultureInfo.InvariantCulture)); break; case PartSyncFieldType.Integer: module.UpdateValue(msgData.FieldName, msgData.IntValue.ToString(CultureInfo.InvariantCulture)); break; case PartSyncFieldType.Float: module.UpdateValue(msgData.FieldName, msgData.FloatValue.ToString(CultureInfo.InvariantCulture)); break; default: throw new ArgumentOutOfRangeException(); } } } }
/// <summary> /// Updates the proto vessel with the values we received about a part module change /// </summary> private static void UpdateProtoVesselFileWithNewPartSyncFieldData(Classes.Vessel vessel, VesselPartSyncFieldMsgData msgData) { var part = vessel.GetPart(msgData.PartFlightId); if (part != null) { var module = part.GetSingleModule(msgData.ModuleName); if (module != null) { switch (msgData.FieldType) { case PartSyncFieldType.Boolean: module.UpdateValue(msgData.FieldName, msgData.BoolValue.ToString(CultureInfo.InvariantCulture)); break; case PartSyncFieldType.Integer: module.UpdateValue(msgData.FieldName, msgData.IntValue.ToString(CultureInfo.InvariantCulture)); break; case PartSyncFieldType.Float: module.UpdateValue(msgData.FieldName, msgData.FloatValue.ToString(CultureInfo.InvariantCulture)); break; case PartSyncFieldType.Double: module.UpdateValue(msgData.FieldName, msgData.DoubleValue.ToString(CultureInfo.InvariantCulture)); break; case PartSyncFieldType.Vector3: module.UpdateValue(msgData.FieldName, $"{msgData.VectorValue[0].ToString(CultureInfo.InvariantCulture)}," + $"{msgData.VectorValue[1].ToString(CultureInfo.InvariantCulture)}," + $"{msgData.VectorValue[2].ToString(CultureInfo.InvariantCulture)}"); break; case PartSyncFieldType.Quaternion: module.UpdateValue(msgData.FieldName, $"{msgData.QuaternionValue[0].ToString(CultureInfo.InvariantCulture)}," + $"{msgData.QuaternionValue[1].ToString(CultureInfo.InvariantCulture)}," + $"{msgData.QuaternionValue[2].ToString(CultureInfo.InvariantCulture)}," + $"{msgData.QuaternionValue[3].ToString(CultureInfo.InvariantCulture)}"); break; case PartSyncFieldType.Object: case PartSyncFieldType.String: case PartSyncFieldType.Enum: module.UpdateValue(msgData.FieldName, msgData.StrValue); break; default: throw new ArgumentOutOfRangeException(); } } } }
/// <summary> /// Raw updates a vessel in the dictionary and takes care of the locking in case we received another vessel message type /// </summary> public static void RawConfigNodeInsertOrUpdate(Guid vesselId, string vesselDataInConfigNodeFormat) { Task.Run(() => { var vessel = new Classes.Vessel(vesselDataInConfigNodeFormat); if (GeneralSettings.SettingsStore.ModControl) { var vesselParts = vessel.Parts.GetAllValues().Select(p => p.Fields.GetSingle("name").Value); var bannedParts = vesselParts.Except(ModFileSystem.ModControl.AllowedParts); if (bannedParts.Any()) { LunaLog.Warning($"Received a vessel with BANNED parts! {vesselId}"); return; } } lock (Semaphore.GetOrAdd(vesselId, new object())) { VesselStoreSystem.CurrentVessels.AddOrUpdate(vesselId, vessel, (key, existingVal) => vessel); } }); }