示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        /// <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);
            }
        }
示例#4
0
        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;
            }
        }
示例#9
0
 //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);
 }
示例#10
0
 //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);
     }
 }
示例#11
0
 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);
     }
 }