private static void UpdateVesselFields(Vessel vessel, VesselUpdateMsgData msgData)
        {
            vessel.vesselName = msgData.Name;
            vessel.vesselType = (VesselType)Enum.Parse(typeof(VesselType), msgData.Type);

            //Only change this value if vessel is not eva. When vessel is eva or we are in track station we reload it if the situation changes
            if (!vessel.isEVA && HighLogic.LoadedSceneIsFlight)
            {
                vessel.situation = (Vessel.Situations)Enum.Parse(typeof(Vessel.Situations), msgData.Situation);
            }

            //Only change this value if vessel takes off. When the vessel lands the vessel must be reloaded as a whole by the vessel proto system
            if (vessel.Landed && !msgData.Landed)
            {
                vessel.Landed = msgData.Landed;
            }

            vessel.landedAt        = msgData.LandedAt;
            vessel.displaylandedAt = msgData.DisplayLandedAt;

            //Only change this value if vessel splashes. When the vessel splashes the vessel must be reloaded as a whole by the vessel proto system
            if (vessel.Splashed && !msgData.Splashed)
            {
                vessel.Splashed = msgData.Splashed;
            }

            vessel.missionTime          = msgData.MissionTime;
            vessel.launchTime           = msgData.LaunchTime;
            vessel.lastUT               = msgData.LastUt;
            vessel.isPersistent         = msgData.Persistent;
            vessel.referenceTransformId = msgData.RefTransformId;
        }
Ejemplo n.º 2
0
        private static void UpdateActionGroups(Vessel vessel, VesselUpdateMsgData msgData)
        {
            for (var i = 0; i < 17; i++)
            {
                var kspActGrp = (KSPActionGroup)(1 << (i & 31));

                //Ignore SAS if we are spectating as it will fight with the FI
                if (kspActGrp == KSPActionGroup.SAS && VesselCommon.IsSpectating && FlightGlobals.ActiveVessel?.id == vessel.id)
                {
                    if (vessel.ActionGroups[KSPActionGroup.SAS])
                    {
                        vessel.ActionGroups.ToggleGroup(KSPActionGroup.SAS);
                        vessel.ActionGroups.groups[i] = false;
                    }
                    continue;
                }

                if (vessel.ActionGroups.groups[i] != msgData.ActionGroups[i].State)
                {
                    vessel.ActionGroups.ToggleGroup(kspActGrp);
                    vessel.ActionGroups.groups[i]        = msgData.ActionGroups[i].State;
                    vessel.ActionGroups.cooldownTimes[i] = msgData.ActionGroups[i].Time;
                }
            }
        }
Ejemplo n.º 3
0
 private static void UpdateProtoVesselValues(ProtoVessel protoVessel, VesselUpdateMsgData msgData)
 {
     if (protoVessel != null)
     {
         protoVessel.vesselName       = msgData.Name;
         protoVessel.vesselType       = (VesselType)Enum.Parse(typeof(VesselType), msgData.Type);
         protoVessel.distanceTraveled = msgData.DistanceTraveled;
         protoVessel.situation        = (Vessel.Situations)Enum.Parse(typeof(Vessel.Situations), msgData.Situation);
         protoVessel.landed           = msgData.Landed;
         protoVessel.landedAt         = msgData.LandedAt;
         protoVessel.displaylandedAt  = msgData.DisplayLandedAt;
         protoVessel.splashed         = msgData.Splashed;
         protoVessel.missionTime      = msgData.MissionTime;
         protoVessel.launchTime       = msgData.LaunchTime;
         protoVessel.lastUT           = msgData.LastUt;
         protoVessel.persistent       = msgData.Persistent;
         protoVessel.refTransform     = msgData.RefTransformId;
         protoVessel.autoClean        = msgData.AutoClean;
         protoVessel.autoCleanReason  = msgData.AutoCleanReason;
         protoVessel.wasControllable  = msgData.WasControllable;
         protoVessel.stage            = msgData.Stage;
         protoVessel.CoM.x            = msgData.Com[0];
         protoVessel.CoM.y            = msgData.Com[1];
         protoVessel.CoM.z            = msgData.Com[2];
         for (var i = 0; i < 17; i++)
         {
             protoVessel.actionGroups.SetValue(msgData.ActionGroups[i].ActionGroupName, $"{msgData.ActionGroups[i].State}, {msgData.ActionGroups[i].Time}");
         }
     }
 }
Ejemplo n.º 4
0
        public void SendVesselUpdate()
        {
            //TODO: This does not have much performance 0.8ms max... maybe we can use the protovessel for this and do it in another thread?
            var engines       = FlightGlobals.ActiveVessel.FindPartModulesImplementing <ModuleEngines>();
            var shieldedDocks = FlightGlobals.ActiveVessel.FindPartModulesImplementing <ModuleDockingNode>()
                                .Where(e => !e.IsDisabled && e.deployAnimator != null).ToArray();
            // ReSharper disable once UnusedVariable
            var iScalars = FlightGlobals.ActiveVessel.FindPartModulesImplementing <IScalarModule>();
            //This throws a nullpointerexception if you don't have any IScalarModules on the craft.  For example, a buggy with only a rovermate core (the white box) and wheels.
            //IScalarModule module = iScalars.First();
            //Put a hook that when the module stops, we send an event
            //module.OnStop();

            var activeEngines  = engines.Where(e => e.EngineIgnited).Select(e => e.part.craftID).ToArray();
            var stoppedEngines = engines.Where(e => !e.EngineIgnited).Select(e => e.part.craftID).ToArray();
            var decouplers     = FlightGlobals.ActiveVessel.FindPartModulesImplementing <ModuleDecouple>()
                                 .Where(e => !e.isDecoupled).Select(e => e.part.craftID).ToArray();
            var anchoredDecouplers = FlightGlobals.ActiveVessel.FindPartModulesImplementing <ModuleAnchoredDecoupler>()
                                     .Where(e => !e.isDecoupled).Select(e => e.part.craftID).ToArray();
            var clamps            = FlightGlobals.ActiveVessel.FindPartModulesImplementing <LaunchClamp>().Select(e => e.part.craftID).ToArray();
            var docks             = FlightGlobals.ActiveVessel.FindPartModulesImplementing <ModuleDockingNode>().Where(e => !e.IsDisabled).Select(e => e.part.craftID).ToArray();
            var closedShieldDocks = shieldedDocks.Where(d => d.deployAnimator.animSwitch).Select(e => e.part.craftID).ToArray();
            var openedShieldDocks = shieldedDocks.Where(d => !d.deployAnimator.animSwitch).Select(e => e.part.craftID).ToArray();

            var actionGrpControls = new[]
            {
                FlightGlobals.ActiveVessel.ActionGroups[KSPActionGroup.Gear],
                FlightGlobals.ActiveVessel.ActionGroups[KSPActionGroup.Light],
                FlightGlobals.ActiveVessel.ActionGroups[KSPActionGroup.Brakes],
                FlightGlobals.ActiveVessel.ActionGroups[KSPActionGroup.SAS],
                FlightGlobals.ActiveVessel.ActionGroups[KSPActionGroup.RCS]
            };

            var flightState = new FlightCtrlState();

            flightState.CopyFrom(FlightGlobals.ActiveVessel.ctrlState);

            var msg = new VesselUpdateMsgData
            {
                Stage               = FlightGlobals.ActiveVessel.currentStage,
                ActiveEngines       = activeEngines,
                StoppedEngines      = stoppedEngines,
                Decouplers          = decouplers,
                AnchoredDecouplers  = anchoredDecouplers,
                Clamps              = clamps,
                Docks               = docks,
                VesselId            = FlightGlobals.ActiveVessel.id,
                ActiongroupControls = actionGrpControls,
                OpenedShieldedDocks = openedShieldDocks,
                ClosedShieldedDocks = closedShieldDocks
            };

            if (LastMsgSent == null || !MessageDataEqualsToLastMsgSent(msg))
            {
                SendMessage(msg);
                LastMsgSent = msg;
            }
        }
Ejemplo n.º 5
0
 private bool MessageDataEqualsToLastMsgSent(VesselUpdateMsgData msg)
 {
     return(LastMsgSent.Stage == msg.Stage && LastMsgSent.VesselId == msg.VesselId &&
            CommonUtil.ScrambledEquals(LastMsgSent.ActiveEngines, msg.ActiveEngines) &&
            CommonUtil.ScrambledEquals(LastMsgSent.StoppedEngines, msg.StoppedEngines) &&
            CommonUtil.ScrambledEquals(LastMsgSent.Decouplers, msg.Decouplers) &&
            CommonUtil.ScrambledEquals(LastMsgSent.AnchoredDecouplers, msg.AnchoredDecouplers) &&
            CommonUtil.ScrambledEquals(LastMsgSent.Clamps, msg.Clamps) &&
            CommonUtil.ScrambledEquals(LastMsgSent.Docks, msg.Docks) &&
            CommonUtil.ScrambledEquals(LastMsgSent.ActiongroupControls, msg.ActiongroupControls));
 }
Ejemplo n.º 6
0
        private static void UpdateVesselFields(Vessel vessel, VesselUpdateMsgData msgData)
        {
            vessel.protoVessel.vesselName       = vessel.vesselName = msgData.Name;
            vessel.protoVessel.vesselType       = vessel.vesselType = (VesselType)Enum.Parse(typeof(VesselType), msgData.Type);
            vessel.protoVessel.distanceTraveled = vessel.distanceTraveled = msgData.DistanceTraveled;

            vessel.protoVessel.situation = (Vessel.Situations)Enum.Parse(typeof(Vessel.Situations), msgData.Situation);
            //Only change this value if vessel is loaded. When vessel is not loaded we reload it if the situation changes
            if (vessel.loaded)
            {
                vessel.situation = vessel.protoVessel.situation;
            }

            vessel.protoVessel.landed = msgData.Landed;
            //Only change this value if vessel takes off and is loaded.
            //When the vessel lands the vessel must be reloaded as a whole by the vessel proto system if it's not loaded
            if (vessel.loaded && vessel.Landed && !msgData.Landed)
            {
                vessel.Landed = vessel.protoVessel.landed;
            }

            vessel.protoVessel.landedAt        = vessel.landedAt = msgData.LandedAt;
            vessel.protoVessel.displaylandedAt = vessel.displaylandedAt = msgData.DisplayLandedAt;

            vessel.protoVessel.splashed = msgData.Splashed;
            //Only change this value if vessel splashes. When the vessel splashes the vessel must be reloaded as a whole by the vessel proto system
            if (vessel.Splashed && !msgData.Splashed)
            {
                vessel.Splashed = vessel.protoVessel.splashed;
            }

            vessel.protoVessel.missionTime  = vessel.missionTime = msgData.MissionTime;
            vessel.protoVessel.launchTime   = vessel.launchTime = msgData.LaunchTime;
            vessel.protoVessel.lastUT       = vessel.lastUT = msgData.LastUt;
            vessel.protoVessel.persistent   = vessel.isPersistent = msgData.Persistent;
            vessel.protoVessel.refTransform = vessel.referenceTransformId = msgData.RefTransformId;

            if (msgData.AutoClean)
            {
                vessel.SetAutoClean(msgData.AutoCleanReason);
            }

            //vessel.IsControllable = msgData.WasControllable;

            vessel.currentStage = msgData.Stage;

            vessel.localCoM.x = msgData.Com[0];
            vessel.localCoM.y = msgData.Com[1];
            vessel.localCoM.z = msgData.Com[2];
        }
Ejemplo n.º 7
0
        public void SendVesselUpdate()
        {
            var engines = FlightGlobals.ActiveVessel.FindPartModulesImplementing <ModuleEngines>();

            var activeEngines  = engines.Where(e => e.EngineIgnited).Select(e => e.part.craftID).ToArray();
            var stoppedEngines = engines.Where(e => !e.EngineIgnited).Select(e => e.part.craftID).ToArray();
            var decouplers     = FlightGlobals.ActiveVessel.FindPartModulesImplementing <ModuleDecouple>()
                                 .Where(e => !e.isDecoupled).Select(e => e.part.craftID).ToArray();
            var anchoredDecouplers = FlightGlobals.ActiveVessel.FindPartModulesImplementing <ModuleAnchoredDecoupler>()
                                     .Where(e => !e.isDecoupled).Select(e => e.part.craftID).ToArray();
            var clamps = FlightGlobals.ActiveVessel.FindPartModulesImplementing <LaunchClamp>().Select(e => e.part.craftID).ToArray();
            var docks  = FlightGlobals.ActiveVessel.FindPartModulesImplementing <ModuleDockingNode>().Where(e => !e.IsDisabled).Select(e => e.part.craftID).ToArray();

            var actionGrpControls = new[]
            {
                FlightGlobals.ActiveVessel.ActionGroups[KSPActionGroup.Gear],
                FlightGlobals.ActiveVessel.ActionGroups[KSPActionGroup.Light],
                FlightGlobals.ActiveVessel.ActionGroups[KSPActionGroup.Brakes],
                FlightGlobals.ActiveVessel.ActionGroups[KSPActionGroup.SAS],
                FlightGlobals.ActiveVessel.ActionGroups[KSPActionGroup.RCS]
            };

            var flightState = new FlightCtrlState();

            flightState.CopyFrom(FlightGlobals.ActiveVessel.ctrlState);

            var msg = new VesselUpdateMsgData
            {
                Stage               = FlightGlobals.ActiveVessel.currentStage,
                ActiveEngines       = activeEngines,
                StoppedEngines      = stoppedEngines,
                Decouplers          = decouplers,
                AnchoredDecouplers  = anchoredDecouplers,
                Clamps              = clamps,
                Docks               = docks,
                VesselId            = FlightGlobals.ActiveVessel.id,
                ActiongroupControls = actionGrpControls,
            };

            if (MsgIsDifferentThanLastMsgSent(msg))
            {
                SendMessage(msg);
                LastMsgSent = msg;
            }
        }
Ejemplo n.º 8
0
 public static void UpdateVesselProtoValues(VesselUpdateMsgData msgData)
 {
     if (AllPlayerVessels.TryGetValue(msgData.VesselId, out var vesselProtoUpd))
     {
         vesselProtoUpd.ProtoVessel.vesselName      = msgData.Name;
         vesselProtoUpd.ProtoVessel.vesselType      = (VesselType)Enum.Parse(typeof(VesselType), msgData.Type);
         vesselProtoUpd.ProtoVessel.situation       = (Vessel.Situations)Enum.Parse(typeof(Vessel.Situations), msgData.Situation);
         vesselProtoUpd.ProtoVessel.landed          = msgData.Landed;
         vesselProtoUpd.ProtoVessel.landedAt        = msgData.LandedAt;
         vesselProtoUpd.ProtoVessel.displaylandedAt = msgData.DisplayLandedAt;
         vesselProtoUpd.ProtoVessel.splashed        = msgData.Splashed;
         vesselProtoUpd.ProtoVessel.missionTime     = msgData.MissionTime;
         vesselProtoUpd.ProtoVessel.launchTime      = msgData.LaunchTime;
         vesselProtoUpd.ProtoVessel.lastUT          = msgData.LastUt;
         vesselProtoUpd.ProtoVessel.persistent      = msgData.Persistent;
         vesselProtoUpd.ProtoVessel.refTransform    = msgData.RefTransformId;
     }
 }
        public void SendVesselUpdate(VesselUpdate update)
        {
            var msg = new VesselUpdateMsgData
            {
                GameSentTime        = Time.fixedTime,
                Stage               = update.Stage,
                PlanetTime          = update.PlanetTime,
                ActiveEngines       = update.ActiveEngines,
                StoppedEngines      = update.StoppedEngines,
                Decouplers          = update.Decouplers,
                AnchoredDecouplers  = update.AnchoredDecouplers,
                Clamps              = update.Clamps,
                Docks               = update.Docks,
                VesselId            = update.VesselId,
                Acceleration        = update.Acceleration,
                ActiongroupControls = update.ActionGrpControls,
                BodyName            = update.BodyName,
                GearDown            = update.FlightState.gearDown,
                GearUp              = update.FlightState.gearUp,
                Headlight           = update.FlightState.headlight,
                IsSurfaceUpdate     = update.IsSurfaceUpdate,
                KillRot             = update.FlightState.killRot,
                MainThrottle        = update.FlightState.mainThrottle,
                Orbit               = update.Orbit,
                Pitch               = update.FlightState.pitch,
                PitchTrim           = update.FlightState.pitchTrim,
                Position            = update.Position,
                Roll              = update.FlightState.roll,
                RollTrim          = update.FlightState.rollTrim,
                Rotation          = update.Rotation,
                Velocity          = update.Velocity,
                WheelSteer        = update.FlightState.wheelSteer,
                WheelSteerTrim    = update.FlightState.wheelSteerTrim,
                WheelThrottle     = update.FlightState.wheelThrottle,
                WheelThrottleTrim = update.FlightState.wheelThrottleTrim,
                X       = update.FlightState.X,
                Y       = update.FlightState.Y,
                Yaw     = update.FlightState.yaw,
                YawTrim = update.FlightState.yawTrim,
                Z       = update.FlightState.Z
            };

            SendMessage(msg);
        }
Ejemplo n.º 10
0
        private bool MsgIsDifferentThanLastMsgSent(VesselUpdateMsgData msg)
        {
            if (LastMsgSent == msg)
            {
                return(false);
            }

            if (LastMsgSent == null || msg == null)
            {
                return(true);
            }

            return(LastMsgSent.Stage == msg.Stage && LastMsgSent.VesselId == msg.VesselId &&
                   CommonUtil.ScrambledEquals(LastMsgSent.ActiveEngines, msg.ActiveEngines) &&
                   CommonUtil.ScrambledEquals(LastMsgSent.StoppedEngines, msg.StoppedEngines) &&
                   CommonUtil.ScrambledEquals(LastMsgSent.Decouplers, msg.Decouplers) &&
                   CommonUtil.ScrambledEquals(LastMsgSent.AnchoredDecouplers, msg.AnchoredDecouplers) &&
                   CommonUtil.ScrambledEquals(LastMsgSent.Clamps, msg.Clamps) &&
                   CommonUtil.ScrambledEquals(LastMsgSent.Docks, msg.Docks) &&
                   CommonUtil.ScrambledEquals(LastMsgSent.ActiongroupControls, msg.ActiongroupControls));
        }
        private static void UpdateProtoVesselValues(ProtoVessel protoVessel, VesselUpdateMsgData msgData)
        {
            if (protoVessel != null)
            {
                protoVessel.vesselName      = msgData.Name;
                protoVessel.vesselType      = (VesselType)Enum.Parse(typeof(VesselType), msgData.Type);
                protoVessel.situation       = (Vessel.Situations)Enum.Parse(typeof(Vessel.Situations), msgData.Situation);
                protoVessel.landed          = msgData.Landed;
                protoVessel.landedAt        = msgData.LandedAt;
                protoVessel.displaylandedAt = msgData.DisplayLandedAt;
                protoVessel.splashed        = msgData.Splashed;
                protoVessel.missionTime     = msgData.MissionTime;
                protoVessel.launchTime      = msgData.LaunchTime;
                protoVessel.lastUT          = msgData.LastUt;
                protoVessel.persistent      = msgData.Persistent;
                protoVessel.refTransform    = msgData.RefTransformId;

                for (var i = 0; i < 17; i++)
                {
                    protoVessel.actionGroups.SetValue(msgData.ActionGroups[i].ActionGroupName, $"{msgData.ActionGroups[i].State}, {msgData.ActionGroups[i].Time}");
                }
            }
        }
Ejemplo n.º 12
0
        public static void UpdateVesselProtoValues(VesselUpdateMsgData msgData)
        {
            if (AllPlayerVessels.TryGetValue(msgData.VesselId, out var vesselProtoUpd))
            {
                if (vesselProtoUpd.ProtoVessel == null)
                {
                    return;
                }

                vesselProtoUpd.ProtoVessel.vesselName       = msgData.Name;
                vesselProtoUpd.ProtoVessel.vesselType       = (VesselType)Enum.Parse(typeof(VesselType), msgData.Type);
                vesselProtoUpd.ProtoVessel.distanceTraveled = msgData.DistanceTraveled;
                vesselProtoUpd.ProtoVessel.situation        = (Vessel.Situations)Enum.Parse(typeof(Vessel.Situations), msgData.Situation);
                vesselProtoUpd.ProtoVessel.landed           = msgData.Landed;
                vesselProtoUpd.ProtoVessel.landedAt         = msgData.LandedAt;
                vesselProtoUpd.ProtoVessel.displaylandedAt  = msgData.DisplayLandedAt;
                vesselProtoUpd.ProtoVessel.splashed         = msgData.Splashed;
                vesselProtoUpd.ProtoVessel.missionTime      = msgData.MissionTime;
                vesselProtoUpd.ProtoVessel.launchTime       = msgData.LaunchTime;
                vesselProtoUpd.ProtoVessel.lastUT           = msgData.LastUt;
                vesselProtoUpd.ProtoVessel.persistent       = msgData.Persistent;
                vesselProtoUpd.ProtoVessel.refTransform     = msgData.RefTransformId;
                vesselProtoUpd.ProtoVessel.autoClean        = msgData.AutoClean;
                vesselProtoUpd.ProtoVessel.autoCleanReason  = msgData.AutoCleanReason;
                vesselProtoUpd.ProtoVessel.wasControllable  = msgData.WasControllable;
                vesselProtoUpd.ProtoVessel.stage            = msgData.Stage;
                vesselProtoUpd.ProtoVessel.CoM.x            = msgData.Com[0];
                vesselProtoUpd.ProtoVessel.CoM.y            = msgData.Com[1];
                vesselProtoUpd.ProtoVessel.CoM.z            = msgData.Com[2];

                vesselProtoUpd.ProtoVessel.actionGroups.ClearValues();
                for (var i = 0; i < vesselProtoUpd.ProtoVessel.actionGroups.values.Count; i++)
                {
                    vesselProtoUpd.ProtoVessel.actionGroups.AddValue(msgData.ActionGroups[i].ActionGroupName, msgData.ActionGroups[i].State + ", " + msgData.ActionGroups[i].Time);
                }
            }
        }
Ejemplo n.º 13
0
        private static void HandleVesselUpdate(VesselUpdateMsgData msg)
        {
            var vessel = FlightGlobals.FindVessel(msg.VesselId);

            if (vessel == null || !vessel.loaded)
            {
                return;
            }

            vessel.ActionGroups.SetGroup(KSPActionGroup.Gear, msg.ActiongroupControls[0]);
            vessel.ActionGroups.SetGroup(KSPActionGroup.Light, msg.ActiongroupControls[1]);
            vessel.ActionGroups.SetGroup(KSPActionGroup.Brakes, msg.ActiongroupControls[2]);
            vessel.ActionGroups.SetGroup(KSPActionGroup.SAS, msg.ActiongroupControls[3]);
            vessel.ActionGroups.SetGroup(KSPActionGroup.RCS, msg.ActiongroupControls[4]);

            if (vessel.currentStage != msg.Stage)
            {
                vessel.ActionGroups.ToggleGroup(KSPActionGroup.Stage);
                vessel.currentStage = msg.Stage;
            }
            else
            {
                var engines           = vessel.FindPartModulesImplementing <ModuleEngines>();
                var enginesToActivate = engines.Where(e => !e.EngineIgnited && msg.ActiveEngines.Contains(e.part.craftID));
                var enginesToStop     = engines.Where(e => e.EngineIgnited && msg.StoppedEngines.Contains(e.part.craftID));

                var decouplersToLaunch = vessel.FindPartModulesImplementing <ModuleDecouple>()
                                         .Where(d => !d.isDecoupled && !msg.Decouplers.Contains(d.part.craftID));

                var anchoredDecouplersToLaunch = vessel.FindPartModulesImplementing <ModuleAnchoredDecoupler>()
                                                 .Where(d => !d.isDecoupled && !msg.Decouplers.Contains(d.part.craftID));

                var clamps = vessel.FindPartModulesImplementing <LaunchClamp>().Where(c => !msg.Clamps.Contains(c.part.craftID));

                var docks = vessel.FindPartModulesImplementing <ModuleDockingNode>().Where(d => !d.IsDisabled && !msg.Docks.Contains(d.part.craftID));

                var shieldedDocks = vessel.FindPartModulesImplementing <ModuleDockingNode>().Where(d => !d.IsDisabled && d.deployAnimator != null);

                var shieldedDocksToToggle = shieldedDocks.Where(
                    d => d.deployAnimator.animSwitch && msg.OpenedShieldedDocks.Contains(d.part.craftID) ||
                    !d.deployAnimator.animSwitch && msg.ClosedShieldedDocks.Contains(d.part.craftID));

                foreach (var engine in enginesToActivate)
                {
                    engine.Activate();
                }

                foreach (var engine in enginesToStop)
                {
                    engine.Shutdown();
                }

                foreach (var decoupler in decouplersToLaunch)
                {
                    decoupler.Decouple();
                }

                foreach (var anchoredDecoupler in anchoredDecouplersToLaunch)
                {
                    anchoredDecoupler.Decouple();
                }

                foreach (var clamp in clamps)
                {
                    clamp.Release();
                }

                foreach (var dock in docks)
                {
                    dock.Decouple();
                }

                foreach (var shieldedDock in shieldedDocksToToggle)
                {
                    shieldedDock.deployAnimator?.Toggle();
                }
            }
        }
 private static double CalculateDistance(VesselUpdateMsgData point1, VesselUpdateMsgData point2)
 {
     return(CalculateDistance(new[] { point1.X, point1.Y, point1.Z }, new[] { point2.X, point2.Y, point2.Z }));
 }
 public static void RelayVesselUpdateMsg(ClientStructure client, VesselUpdateMsgData msg)
 {
     IncomingUpdates.Enqueue(new KeyValuePair <ClientStructure, VesselUpdateMsgData>(client, msg));
 }
Ejemplo n.º 16
0
        /// <summary>
        /// Updates the proto vessel file with the values we received about a position of a vessel
        /// </summary>
        private static string UpdateProtoVesselFileWithNewUpdateData(string[] protoVesselLines, VesselUpdateMsgData msgData)
        {
            var fullText = string.Join(Environment.NewLine, protoVesselLines);

            var regex = new Regex("(?<prefix>name = )(.*)\n");

            fullText = regex.Replace(fullText, "${prefix}" + msgData.Name + Environment.NewLine, 1);

            regex    = new Regex("(?<prefix>type = )(.*)\n");
            fullText = regex.Replace(fullText, "${prefix}" + msgData.Type + Environment.NewLine, 1);

            regex    = new Regex("(?<prefix>sit = )(.*)\n");
            fullText = regex.Replace(fullText, "${prefix}" + msgData.Situation + Environment.NewLine, 1);

            regex    = new Regex("(?<prefix>landed = )(.*)\n");
            fullText = regex.Replace(fullText, "${prefix}" + msgData.Landed.ToString(CultureInfo.InvariantCulture) + Environment.NewLine, 1);

            regex    = new Regex("(?<prefix>landedAt = )(.*)\n");
            fullText = regex.Replace(fullText, "${prefix}" + msgData.LandedAt + Environment.NewLine, 1);

            regex    = new Regex("(?<prefix>displaylandedAt = )(.*)\n");
            fullText = regex.Replace(fullText, "${prefix}" + msgData.DisplayLandedAt + Environment.NewLine, 1);

            regex    = new Regex("(?<prefix>splashed = )(.*)\n");
            fullText = regex.Replace(fullText, "${prefix}" + msgData.Splashed.ToString(CultureInfo.InvariantCulture) + Environment.NewLine, 1);

            regex    = new Regex("(?<prefix>met = )(.*)\n");
            fullText = regex.Replace(fullText, "${prefix}" + msgData.MissionTime.ToString(CultureInfo.InvariantCulture) + Environment.NewLine, 1);

            regex    = new Regex("(?<prefix>lct = )(.*)\n");
            fullText = regex.Replace(fullText, "${prefix}" + msgData.LaunchTime.ToString(CultureInfo.InvariantCulture) + Environment.NewLine, 1);

            regex    = new Regex("(?<prefix>lastUT = )(.*)\n");
            fullText = regex.Replace(fullText, "${prefix}" + msgData.LastUt.ToString(CultureInfo.InvariantCulture) + Environment.NewLine, 1);

            regex    = new Regex("(?<prefix>prst = )(.*)\n");
            fullText = regex.Replace(fullText, "${prefix}" + msgData.Persistent.ToString(CultureInfo.InvariantCulture) + Environment.NewLine, 1);

            regex    = new Regex("(?<prefix>ref = )(.*)\n");
            fullText = regex.Replace(fullText, "${prefix}" + msgData.RefTransformId.ToString(CultureInfo.InvariantCulture) + Environment.NewLine, 1);

            foreach (var actionGroup in msgData.ActionGroups)
            {
                regex = new Regex($"(?<prefix>{actionGroup.ActionGroupName} = )(.*)\n");
                var newValue = actionGroup.State.ToString(CultureInfo.InvariantCulture) + ", " + actionGroup.Time.ToString(CultureInfo.InvariantCulture);

                fullText = regex.Replace(fullText, "${prefix}" + newValue + Environment.NewLine, 1);
            }

            return(fullText);
        }
Ejemplo n.º 17
0
        /// <summary>
        /// Updates the proto vessel with the values we received about a position of a vessel
        /// </summary>
        private static string UpdateProtoVesselWithNewUpdateData(string vesselData, VesselUpdateMsgData msgData)
        {
            var document = new XmlDocument();

            document.LoadXml(vesselData);

            var node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='name']");

            if (node != null)
            {
                node.InnerText = msgData.Name;
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='type']");
            if (node != null)
            {
                node.InnerText = msgData.Type;
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='sit']");
            if (node != null)
            {
                node.InnerText = msgData.Situation;
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='landed']");
            if (node != null)
            {
                node.InnerText = msgData.Landed.ToString(CultureInfo.InvariantCulture);
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='landedAt']");
            if (node != null)
            {
                node.InnerText = msgData.LandedAt;
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='displaylandedAt']");
            if (node != null)
            {
                node.InnerText = msgData.DisplayLandedAt;
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='splashed']");
            if (node != null)
            {
                node.InnerText = msgData.Splashed.ToString(CultureInfo.InvariantCulture);
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='met']");
            if (node != null)
            {
                node.InnerText = msgData.MissionTime.ToString(CultureInfo.InvariantCulture);
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='lct']");
            if (node != null)
            {
                node.InnerText = msgData.LaunchTime.ToString(CultureInfo.InvariantCulture);
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='lastUT']");
            if (node != null)
            {
                node.InnerText = msgData.LastUt.ToString(CultureInfo.InvariantCulture);
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='prst']");
            if (node != null)
            {
                node.InnerText = msgData.Persistent.ToString(CultureInfo.InvariantCulture);
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='ref']");
            if (node != null)
            {
                node.InnerText = msgData.RefTransformId.ToString(CultureInfo.InvariantCulture);
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='cln']");
            if (node != null)
            {
                node.InnerText = msgData.AutoClean.ToString(CultureInfo.InvariantCulture);
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='clnRsn']");
            if (node != null)
            {
                node.InnerText = msgData.AutoCleanReason;
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='ctrl']");
            if (node != null)
            {
                node.InnerText = msgData.WasControllable.ToString(CultureInfo.InvariantCulture);
            }

            node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='stg']");
            if (node != null)
            {
                node.InnerText = msgData.Stage.ToString(CultureInfo.InvariantCulture);
            }

            //NEVER! patch the CoM in the protovessel as then it will be drawn with incorrect CommNet lines!
            //node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ValueNode}[@name='CoM']");
            //if (node != null) node.InnerText = $"{msgData.Com[0].ToString(CultureInfo.InvariantCulture)}," +
            //                                $"{msgData.Com[1].ToString(CultureInfo.InvariantCulture)}," +
            //                                $"{msgData.Com[2].ToString(CultureInfo.InvariantCulture)}";

            foreach (var actionGroup in msgData.ActionGroups)
            {
                node = document.SelectSingleNode($"/{ConfigNodeXmlParser.StartElement}/{ConfigNodeXmlParser.ParentNode}[@name='ACTIONGROUPS']/{ConfigNodeXmlParser.ValueNode}[@name='{actionGroup.ActionGroupName}']");
                if (node != null)
                {
                    node.InnerText = $"{actionGroup.State.ToString(CultureInfo.InvariantCulture)}, {actionGroup.Time.ToString(CultureInfo.InvariantCulture)}";
                }
            }

            return(document.ToIndentedString());
        }