/// <summary> /// Patches the scenario file with science subject data /// </summary> private static string UpdateScenarioWithScienceSubject(string scenarioData, ScienceSubjectInfo scienceSubject) { var document = new XmlDocument(); document.LoadXml(scenarioData); var receivedScienceSubjectXmlNode = DeserializeAndImportNode(scienceSubject.Data, scienceSubject.NumBytes, document)? .SelectSingleNode($"/{ConfigNodeXmlParser.ParentNode}[@name='Science']"); if (receivedScienceSubjectXmlNode == null) { return(document.ToIndentedString()); } var parentNode = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}"); if (parentNode != null) { var existingNode = parentNode.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ParentNode}[@name='Science']" + $@"/{ConfigNodeXmlParser.ValueNode}[@name='id' and text()=""{scienceSubject.Id}""]" + $"/parent::{ConfigNodeXmlParser.ParentNode}[@name='Science']"); if (existingNode != null) { existingNode.InnerXml = receivedScienceSubjectXmlNode.InnerXml; } else { var importNode = document.ImportNode(receivedScienceSubjectXmlNode, true); parentNode.AppendChild(importNode); } } return(document.ToIndentedString()); }
/// <summary> /// We received a science subject message so update the scenario file accordingly /// </summary> public static void WriteScienceSubjectDataToFile(ScienceSubjectInfo scienceSubject) { Task.Run(() => { lock (Semaphore.GetOrAdd("ResearchAndDevelopment", new object())) { if (!ScenarioStoreSystem.CurrentScenarios.TryGetValue("ResearchAndDevelopment", out var scenario)) { return; } var receivedNode = new ConfigNode(Encoding.UTF8.GetString(scienceSubject.Data, 0, scienceSubject.NumBytes)) { Parent = scenario, Name = "Science" }; if (receivedNode.IsEmpty()) { return; } var techNodes = scenario.GetNodes("Science").Select(v => v.Value); var specificTechNode = techNodes.FirstOrDefault(n => n.GetValue("id").Value == receivedNode.GetValue("id").Value); if (specificTechNode != null) { scenario.ReplaceNode(specificTechNode, receivedNode); } else { scenario.AddNode(receivedNode); } } }); }
/// <summary> /// We received a science subject message so update the scenario file accordingly /// </summary> public static void WriteScienceSubjectDataToFile(ScienceSubjectInfo scienceSubject) { Task.Run(() => { lock (Semaphore.GetOrAdd("ResearchAndDevelopment", new object())) { if (!ScenarioStoreSystem.CurrentScenariosInXmlFormat.TryGetValue("ResearchAndDevelopment", out var xmlData)) { return; } var updatedText = UpdateScenarioWithScienceSubject(xmlData, scienceSubject); ScenarioStoreSystem.CurrentScenariosInXmlFormat.TryUpdate("ResearchAndDevelopment", updatedText, xmlData); } }); }
public void HandleMessage(IServerMessageBase msg) { if (!(msg.Data is ShareProgressBaseMsgData msgData)) { return; } if (msgData.ShareProgressMessageType != ShareProgressMessageType.ScienceSubjectUpdate) { return; } if (msgData is ShareProgressScienceSubjectMsgData data) { var subject = new ScienceSubjectInfo(data.ScienceSubject); //create a copy of the tech value so it will not change in the future. LunaLog.Log($"Queue Science subject: {subject.Id}"); System.QueueAction(() => { NewScienceSubject(subject); }); } }
private static void NewScienceSubject(ScienceSubjectInfo subject) { System.StartIgnoringEvents(); var currentSubjects = System.ScienceSubjects; var receivedSubject = ConvertByteArrayToScienceSubject(subject.Data, subject.NumBytes); if (!currentSubjects.TryGetValue(subject.Id, out var existingSubject)) { currentSubjects.Add(receivedSubject.id, receivedSubject); } else { existingSubject.dataScale = receivedSubject.dataScale; existingSubject.scientificValue = receivedSubject.scientificValue; existingSubject.subjectValue = receivedSubject.subjectValue; existingSubject.science = receivedSubject.science; existingSubject.scienceCap = receivedSubject.scienceCap; } System.StopIgnoringEvents(); LunaLog.Log($"Science subject received: {subject.Id}"); }