public void SendKerbal(ProtoCrewMember pcm) { if (pcm == null) { return; } if (VesselCommon.IsSpectating) { return; } ConfigNode.ClearData(); pcm.Save(ConfigNode); var kerbalBytes = ConfigNode.Serialize(); if (kerbalBytes == null || kerbalBytes.Length == 0) { LunaLog.LogError("[LMP]: Error sending kerbal - bytes are null or 0"); return; } SendKerbalProtoMessage(pcm.name, kerbalBytes); }
public void SendKerbal(ProtoCrewMember pcm) { if (pcm == null) { return; } if (VesselCommon.IsSpectating) { return; } if (pcm.type == ProtoCrewMember.KerbalType.Tourist) { //Don't send tourists LunaLog.Log($"[LMP]: Skipping sending of tourist: {pcm.name}"); return; } ConfigNode.ClearData(); pcm.Save(ConfigNode); var kerbalBytes = ConfigNodeSerializer.Serialize(ConfigNode); if (kerbalBytes == null || kerbalBytes.Length == 0) { LunaLog.LogError("[LMP]: Error sending kerbal - bytes are null or 0"); return; } SendKerbalProtoMessage(pcm.name, kerbalBytes); }
/// <summary> /// Creates a new Kerbal /// </summary> private void CreateKerbal(ProtoCrewMember protoCrew) { HighLogic.CurrentGame.CrewRoster.AddCrewMember(protoCrew); var kerbalNode = new ConfigNode(); protoCrew.Save(kerbalNode); var kerbalBytes = ConfigNodeSerializer.Serialize(kerbalNode); if (kerbalBytes != null && kerbalBytes.Length != 0) { ServerKerbals[protoCrew.name] = Common.CalculateSha256Hash(kerbalBytes); } }
public void SendKerbalIfDifferent(ProtoCrewMember pcm) { if (pcm.type == ProtoCrewMember.KerbalType.Tourist) { //Don't send tourists LunaLog.Log($"[LMP]: Skipping sending of tourist: {pcm.name}"); return; } var kerbalNode = new ConfigNode(); pcm.Save(kerbalNode); var kerbalBytes = ConfigNodeSerializer.Serialize(kerbalNode); if (kerbalBytes == null || kerbalBytes.Length == 0) { LunaLog.Log("[LMP]: VesselWorker: Error sending kerbal - bytes are null or 0"); return; } var kerbalHash = Common.CalculateSha256Hash(kerbalBytes); var kerbalDifferent = false; if (!System.ServerKerbals.ContainsKey(pcm.name)) { //New kerbal LunaLog.Log("[LMP]: Found new kerbal, sending..."); kerbalDifferent = true; } else if (System.ServerKerbals[pcm.name] != kerbalHash) { LunaLog.Log($"[LMP]: Found changed kerbal ({pcm.name}), sending..."); kerbalDifferent = true; } if (kerbalDifferent) { System.ServerKerbals[pcm.name] = kerbalHash; SendKerbalProtoMessage(pcm.name, kerbalBytes); } }
private void LoadKerbal(ConfigNode crewNode) { if (crewNode == null) { DarkLog.Debug("crewNode is null!"); return; } ProtoCrewMember protoCrew = new ProtoCrewMember(HighLogic.CurrentGame.Mode, crewNode); if (protoCrew == null) { DarkLog.Debug("protoCrew is null!"); return; } if (String.IsNullOrEmpty(protoCrew.name)) { DarkLog.Debug("protoName is blank!"); return; } protoCrew.type = ProtoCrewMember.KerbalType.Crew; if (!HighLogic.CurrentGame.CrewRoster.Exists(protoCrew.name)) { AddCrewMemberToRoster(protoCrew); ConfigNode kerbalNode = new ConfigNode(); protoCrew.Save(kerbalNode); byte[] kerbalBytes = ConfigNodeSerializer.fetch.Serialize(kerbalNode); if (kerbalBytes != null && kerbalBytes.Length != 0) { serverKerbals[protoCrew.name] = Common.CalculateSHA256Hash(kerbalBytes); } } else { ConfigNode careerLogNode = crewNode.GetNode("CAREER_LOG"); if (careerLogNode != null) { //This method is broken. Thanks squad. HighLogic.CurrentGame.CrewRoster[protoCrew.name].careerLog.Load(careerLogNode); } else { DarkLog.Debug("Career log node for " + protoCrew.name + " is empty!"); } ConfigNode flightLogNode = crewNode.GetNode("FLIGHT_LOG"); if (careerLogNode != null) { //This method is broken. Thanks squad. HighLogic.CurrentGame.CrewRoster[protoCrew.name].flightLog.Load(flightLogNode); } else { DarkLog.Debug("Flight log node for " + protoCrew.name + " is empty!"); } HighLogic.CurrentGame.CrewRoster[protoCrew.name].courage = protoCrew.courage; HighLogic.CurrentGame.CrewRoster[protoCrew.name].experience = protoCrew.experience; HighLogic.CurrentGame.CrewRoster[protoCrew.name].experienceLevel = protoCrew.experienceLevel; HighLogic.CurrentGame.CrewRoster[protoCrew.name].gender = protoCrew.gender; HighLogic.CurrentGame.CrewRoster[protoCrew.name].hasToured = protoCrew.hasToured; HighLogic.CurrentGame.CrewRoster[protoCrew.name].isBadass = protoCrew.isBadass; HighLogic.CurrentGame.CrewRoster[protoCrew.name].rosterStatus = protoCrew.rosterStatus; HighLogic.CurrentGame.CrewRoster[protoCrew.name].seat = protoCrew.seat; HighLogic.CurrentGame.CrewRoster[protoCrew.name].seatIdx = protoCrew.seatIdx; HighLogic.CurrentGame.CrewRoster[protoCrew.name].stupidity = protoCrew.stupidity; HighLogic.CurrentGame.CrewRoster[protoCrew.name].UTaR = protoCrew.UTaR; } }
public void SendKerbalIfDifferent(ProtoCrewMember pcm) { if (pcm.type == ProtoCrewMember.KerbalType.Tourist) { //Don't send tourists DarkLog.Debug("Skipping sending of tourist: " + pcm.name); return; } ConfigNode kerbalNode = new ConfigNode(); pcm.Save(kerbalNode); byte[] kerbalBytes = ConfigNodeSerializer.fetch.Serialize(kerbalNode); if (kerbalBytes == null || kerbalBytes.Length == 0) { DarkLog.Debug("VesselWorker: Error sending kerbal - bytes are null or 0"); return; } string kerbalHash = Common.CalculateSHA256Hash(kerbalBytes); bool kerbalDifferent = false; if (!serverKerbals.ContainsKey(pcm.name)) { //New kerbal DarkLog.Debug("Found new kerbal, sending..."); kerbalDifferent = true; } else if (serverKerbals[pcm.name] != kerbalHash) { DarkLog.Debug("Found changed kerbal (" + pcm.name + "), sending..."); kerbalDifferent = true; } if (kerbalDifferent) { serverKerbals[pcm.name] = kerbalHash; NetworkWorker.fetch.SendKerbalProtoMessage(pcm.name, kerbalBytes); } }
//Called from vesselWorker public void SendKerbalProtoMessage(ProtoCrewMember kerbal) { ConfigNode kerbalNode = new ConfigNode(); kerbal.Save(kerbalNode); byte[] kerbalBytes = ConfigNodeSerializer.fetch.Serialize(kerbalNode); if (kerbalBytes != null && kerbalBytes.Length > 0) { ClientMessage newMessage = new ClientMessage(); newMessage.type = ClientMessageType.KERBAL_PROTO; using (MessageWriter mw = new MessageWriter()) { mw.Write<double>(Planetarium.GetUniversalTime()); mw.Write<string>(kerbal.name); mw.Write<byte[]>(kerbalBytes); newMessage.data = mw.GetMessageBytes(); } DarkLog.Debug("Sending kerbal " + kerbal.name + ", size: " + newMessage.data.Length); QueueOutgoingMessage(newMessage, false); } else { DarkLog.Debug("Failed to create byte[] data for kerbal " + kerbal.name); } }
private void LoadKerbal(ConfigNode crewNode) { if (crewNode == null) { DarkLog.Debug("crewNode is null!"); return; } if (crewNode.GetValue("type") == "Tourist") { ConfigNode dmpNode = null; if (crewNode.TryGetNode("DarkMultiPlayer", ref dmpNode)) { string dmpOwner = null; if (dmpNode.TryGetValue("touristOwner", ref dmpOwner)) { if (dmpOwner != Settings.fetch.playerPublicKey) { DarkLog.Debug("Skipping load of tourist that belongs to another player"); return; } } } } ProtoCrewMember protoCrew = new ProtoCrewMember(HighLogic.CurrentGame.Mode, crewNode); if (protoCrew == null) { DarkLog.Debug("protoCrew is null!"); return; } if (string.IsNullOrEmpty(protoCrew.name)) { DarkLog.Debug("protoName is blank!"); return; } if (!HighLogic.CurrentGame.CrewRoster.Exists(protoCrew.name)) { AddCrewMemberToRoster(protoCrew); ConfigNode kerbalNode = new ConfigNode(); protoCrew.Save(kerbalNode); byte[] kerbalBytes = ConfigNodeSerializer.fetch.Serialize(kerbalNode); if (kerbalBytes != null && kerbalBytes.Length != 0) { serverKerbals[protoCrew.name] = Common.CalculateSHA256Hash(kerbalBytes); } } else { ConfigNode careerLogNode = crewNode.GetNode("CAREER_LOG"); if (careerLogNode != null) { //Insert wolf howling at the moon here HighLogic.CurrentGame.CrewRoster[protoCrew.name].careerLog.Entries.Clear(); HighLogic.CurrentGame.CrewRoster[protoCrew.name].careerLog.Load(careerLogNode); } else { DarkLog.Debug("Career log node for " + protoCrew.name + " is empty!"); } ConfigNode flightLogNode = crewNode.GetNode("FLIGHT_LOG"); if (flightLogNode != null) { //And here. Someone "cannot into" lists and how to protect them. HighLogic.CurrentGame.CrewRoster[protoCrew.name].flightLog.Entries.Clear(); HighLogic.CurrentGame.CrewRoster[protoCrew.name].flightLog.Load(flightLogNode); } HighLogic.CurrentGame.CrewRoster[protoCrew.name].courage = protoCrew.courage; HighLogic.CurrentGame.CrewRoster[protoCrew.name].experience = protoCrew.experience; HighLogic.CurrentGame.CrewRoster[protoCrew.name].experienceLevel = protoCrew.experienceLevel; HighLogic.CurrentGame.CrewRoster[protoCrew.name].experienceTrait = protoCrew.experienceTrait; HighLogic.CurrentGame.CrewRoster[protoCrew.name].gender = protoCrew.gender; HighLogic.CurrentGame.CrewRoster[protoCrew.name].gExperienced = protoCrew.gExperienced; HighLogic.CurrentGame.CrewRoster[protoCrew.name].hasToured = protoCrew.hasToured; HighLogic.CurrentGame.CrewRoster[protoCrew.name].isBadass = protoCrew.isBadass; HighLogic.CurrentGame.CrewRoster[protoCrew.name].KerbalRef = protoCrew.KerbalRef; HighLogic.CurrentGame.CrewRoster[protoCrew.name].outDueToG = protoCrew.outDueToG; HighLogic.CurrentGame.CrewRoster[protoCrew.name].rosterStatus = protoCrew.rosterStatus; HighLogic.CurrentGame.CrewRoster[protoCrew.name].seat = protoCrew.seat; HighLogic.CurrentGame.CrewRoster[protoCrew.name].seatIdx = protoCrew.seatIdx; HighLogic.CurrentGame.CrewRoster[protoCrew.name].stupidity = protoCrew.stupidity; HighLogic.CurrentGame.CrewRoster[protoCrew.name].trait = protoCrew.trait; HighLogic.CurrentGame.CrewRoster[protoCrew.name].type = protoCrew.type; HighLogic.CurrentGame.CrewRoster[protoCrew.name].UTaR = protoCrew.UTaR; HighLogic.CurrentGame.CrewRoster[protoCrew.name].veteran = protoCrew.veteran; } }
//Called from vesselWorker public void SendKerbalProtoMessage(int kerbalID, ProtoCrewMember kerbal) { ConfigNode currentNode = new ConfigNode(); ClientMessage newMessage = new ClientMessage(); newMessage.type = ClientMessageType.KERBAL_PROTO; kerbal.Save(currentNode); string tempFile = Path.GetTempFileName(); currentNode.Save(tempFile); using (StreamReader sr = new StreamReader(tempFile)) { using (MessageWriter mw = new MessageWriter()) { mw.Write<int>(TimeSyncer.fetch.currentSubspace); mw.Write<double>(Planetarium.GetUniversalTime()); mw.Write<int>(kerbalID); mw.Write<byte[]>(File.ReadAllBytes(tempFile)); newMessage.data = mw.GetMessageBytes(); } } File.Delete(tempFile); DarkLog.Debug("Sending kerbal " + kerbal.name + ", size: " + newMessage.data.Length); sendMessageQueueLow.Enqueue(newMessage); }
//Called from vesselWorker public void SendKerbalProtoMessage(int kerbalID, ProtoCrewMember kerbal) { ConfigNode kerbalNode = new ConfigNode(); //Dodge the available status - Too many kerbals are getting created. kerbal.rosterStatus = ProtoCrewMember.RosterStatus.AVAILABLE; kerbal.Save(kerbalNode); byte[] kerbalBytes = ConvertConfigNodeToByteArray(kerbalNode); if (kerbalBytes != null) { ClientMessage newMessage = new ClientMessage(); newMessage.type = ClientMessageType.KERBAL_PROTO; using (MessageWriter mw = new MessageWriter()) { mw.Write<int>(TimeSyncer.fetch.currentSubspace); mw.Write<double>(Planetarium.GetUniversalTime()); mw.Write<int>(kerbalID); mw.Write<byte[]>(kerbalBytes); newMessage.data = mw.GetMessageBytes(); } DarkLog.Debug("Sending kerbal " + kerbal.name + ", size: " + newMessage.data.Length); sendMessageQueueLow.Enqueue(newMessage); } else { DarkLog.Debug("Failed to create byte[] data for kerbal " + kerbalID); } }
public void SendKerbalIfDifferent(ProtoCrewMember pcm) { ConfigNode kerbalNode = new ConfigNode(); pcm.Save(kerbalNode); if (pcm.type == ProtoCrewMember.KerbalType.Tourist || pcm.type == ProtoCrewMember.KerbalType.Unowned) { ConfigNode dmpNode = new ConfigNode(); dmpNode.AddValue("contractOwner", Settings.fetch.playerPublicKey); kerbalNode.AddNode("DarkMultiPlayer", dmpNode); } byte[] kerbalBytes = ConfigNodeSerializer.fetch.Serialize(kerbalNode); if (kerbalBytes == null || kerbalBytes.Length == 0) { DarkLog.Debug("VesselWorker: Error sending kerbal - bytes are null or 0"); return; } string kerbalHash = Common.CalculateSHA256Hash(kerbalBytes); bool kerbalDifferent = false; if (!serverKerbals.ContainsKey(pcm.name)) { //New kerbal DarkLog.Debug("Found new kerbal, sending..."); kerbalDifferent = true; } else if (serverKerbals[pcm.name] != kerbalHash) { DarkLog.Debug("Found changed kerbal (" + pcm.name + "), sending..."); kerbalDifferent = true; } if (kerbalDifferent) { serverKerbals[pcm.name] = kerbalHash; NetworkWorker.fetch.SendKerbalProtoMessage(pcm.name, kerbalBytes); } }