コード例 #1
0
ファイル: Suffixed.cs プロジェクト: silky/KOS
        public override void Execute(SharedObjects shared)
        {
            string       vesselName = shared.Cpu.PopValue().ToString();
            VesselTarget result     = new VesselTarget(VesselUtils.GetVesselByName(vesselName, shared.Vessel), shared.Vessel);

            shared.Cpu.PushStack(result);
        }
コード例 #2
0
 private void PartInitializeSuffixes()
 {
     AddSuffix("CONTROLFROM", new NoArgsVoidSuffix(ControlFrom));
     AddSuffix("NAME", new Suffix <StringValue>(() => Part.name));
     AddSuffix("FUELCROSSFEED", new Suffix <BooleanValue>(() => Part.fuelCrossFeed));
     AddSuffix("TITLE", new Suffix <StringValue>(() => Part.partInfo.title));
     AddSuffix("STAGE", new Suffix <ScalarValue>(() => Part.inverseStage));
     AddSuffix("CID", new Suffix <StringValue>(() => Part.craftID.ToString()));
     AddSuffix("UID", new Suffix <StringValue>(() => Part.flightID.ToString()));
     AddSuffix("ROTATION", new Suffix <Direction>(() => new Direction(Part.transform.rotation)));
     AddSuffix("POSITION", new Suffix <Vector>(() => GetPosition()));
     AddSuffix("TAG", new SetSuffix <StringValue>(GetTagName, SetTagName));
     AddSuffix("FACING", new Suffix <Direction>(() => GetFacing()));
     AddSuffix("BOUNDS", new Suffix <BoundsValue>(GetBoundsValue));
     AddSuffix("RESOURCES", new Suffix <ListValue>(() => GatherResources(Part)));
     AddSuffix("TARGETABLE", new Suffix <BooleanValue>(() => Part.Modules.OfType <ITargetable>().Any()));
     AddSuffix("SHIP", new Suffix <VesselTarget>(() => VesselTarget.CreateOrGetExisting(Part.vessel, Shared)));
     AddSuffix("HASMODULE", new OneArgsSuffix <BooleanValue, StringValue>(HasModule));
     AddSuffix("GETMODULE", new OneArgsSuffix <PartModuleFields, StringValue>(GetModule));
     AddSuffix("GETMODULEBYINDEX", new OneArgsSuffix <PartModuleFields, ScalarValue>(GetModuleIndex));
     AddSuffix(new[] { "MODULES", "ALLMODULES" }, new Suffix <ListValue>(GetAllModules, "A List of all the modules' names on this part"));
     AddSuffix("PARENT", new Suffix <Structure>(() => ParentValue, "The parent part of this part"));
     AddSuffix(new[] { "DECOUPLER", "SEPARATOR" }, new Suffix <Structure>(() => DecouplerValue, "The part that will decouple/separate this part when activated"));
     AddSuffix(new[] { "DECOUPLEDIN", "SEPARATEDIN" }, new Suffix <ScalarValue>(() => DecoupledIn));
     AddSuffix("HASPARENT", new Suffix <BooleanValue>(() => Part.parent != null, "Tells you if this part has a parent, is used to avoid null exception from PARENT"));
     AddSuffix("CHILDREN", new Suffix <ListValue <PartValue> >(() => PartValueFactory.ConstructGeneric(Part.children, Shared), "A LIST() of the children parts of this part"));
     AddSuffix("DRYMASS", new Suffix <ScalarValue>(() => Part.GetDryMass(), "The Part's mass when empty"));
     AddSuffix("MASS", new Suffix <ScalarValue>(() => Part.CalculateCurrentMass(), "The Part's current mass"));
     AddSuffix("WETMASS", new Suffix <ScalarValue>(() => Part.GetWetMass(), "The Part's mass when full"));
     AddSuffix("HASPHYSICS", new Suffix <BooleanValue>(() => Part.HasPhysics(), "Is this a strange 'massless' part"));
 }
コード例 #3
0
        public override void Execute(SharedObjects shared)
        {
            string listType = PopValueAssert(shared).ToString();
            var    list     = new ListValue();

            switch (listType)
            {
            case "bodies":
                foreach (CelestialBody cBody in FlightGlobals.fetch.bodies)
                {
                    list.Add(BodyTarget.CreateOrGetExisting(cBody, shared));
                }
                break;

            case "targets":
                foreach (var vessel in FlightGlobals.Vessels)
                {
                    if (vessel == shared.Vessel)
                    {
                        continue;
                    }
                    list.Add(VesselTarget.CreateOrGetExisting(vessel, shared));
                }
                break;

            case "resources":
            case "parts":
            case "engines":
            case "sensors":
            case "elements":
            case "dockingports":
                list = shared.Vessel.PartList(listType, shared);
                break;

            case "files":
                list = ListValue.CreateList(shared.VolumeMgr.CurrentDirectory.ListAsLexicon().Values.ToList());
                break;

            case "volumes":
                list = ListValue.CreateList(shared.VolumeMgr.Volumes.Values.ToList());
                break;

            case "processors":
                list = ListValue.CreateList(shared.ProcessorMgr.processors.Values.ToList().Select(processor => PartModuleFieldsFactory.Construct(processor, shared)));
                break;

            case "fonts":
                foreach (Font f in Resources.FindObjectsOfTypeAll <Font>())
                {
                    list.Add(new StringValue(f.name));
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            AssertArgBottomAndConsume(shared);

            ReturnValue = list;
        }
コード例 #4
0
        public static ListValue PartsToList(IEnumerable <global::Part> parts, SharedObjects sharedObj)
        {
            var toReturn = new ListValue();
            var vessel   = VesselTarget.CreateOrGetExisting(sharedObj);

            foreach (var part in parts)
            {
                foreach (PartModule module in part.Modules)
                {
                    if (!(module is IStageSeparator))
                    {
                        continue;
                    }
                    var dockingNode = module as ModuleDockingNode;
                    if (dockingNode != null && !dockingNode.stagingEnabled)
                    {
                        continue;
                    }
                    if (module is ModuleDecouple || module is ModuleAnchoredDecoupler ||
                        module is LaunchClamp)
                    {
                        toReturn.Add(vessel[part]);
                    }
                }
            }
            return(toReturn);
        }
コード例 #5
0
        private Guid GetTargetGuid(object target)
        {
            if (target is String)
            {
                String targetString = (String)target;
                if (targetString.Equals(NoTargetString, StringComparison.InvariantCultureIgnoreCase))
                {
                    return(new Guid(NoTargetGuid));
                }
                else if (targetString.Equals(ActiveVesselString, StringComparison.InvariantCultureIgnoreCase))
                {
                    return(new Guid(ActiveVesselGuid));
                }
                else if (targetString.Equals(MissionControlString, StringComparison.InvariantCultureIgnoreCase))
                {
                    return(new Guid(MissionControlGuid));
                }
                else
                {
                    var body = FlightGlobals.Bodies.Where(b => b.bodyName.Equals(targetString, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
                    if (body != null)
                    {
                        return(CelestialBodyGuid(body));
                    }
                    else
                    {
                        var vessel = FlightGlobals.Vessels.Where(v => v.vesselName.Equals(targetString, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
                        if (vessel != null)
                        {
                            if (partModule.vessel.id.Equals(vessel.id))
                            {
                                throw new KOSInvalidFieldValueException("Current vessel can't be the target");
                            }

                            return(vessel.id);
                        }
                    }
                }
            }
            else if (target is BodyTarget)
            {
                BodyTarget targetBody = (BodyTarget)target;
                return(CelestialBodyGuid(targetBody.Body));
            }
            else if (target is VesselTarget)
            {
                VesselTarget targetVessel = (VesselTarget)target;

                if (partModule.vessel.id.Equals(targetVessel.Vessel.id))
                {
                    throw new KOSInvalidFieldValueException("Current vessel can't be the target");
                }

                return(targetVessel.Vessel.id);
            }

            throw new KOSInvalidFieldValueException("'" + NoTargetString + "', '" + ActiveVesselString + "', '" + MissionControlString +
                                                    "', Body or Vessel expected");
        }
コード例 #6
0
 private void RecoverVessel(VesselTarget vessel)
 {
     if (!vessel.Vessel.IsRecoverable)
     {
         throw new kOS.Safe.Exceptions.KOSException("Vessel is not recoverable");
     }
     VesselRecovery.Recover(vessel.Vessel);
 }
コード例 #7
0
        public void ThrowIfNotCPUVessel()
        {
            VesselTarget vt = GetVessel();

            if (vt.Vessel.id != shared.Vessel.id)
            {
                throw new KOSWrongCPUVesselException();
            }
        }
コード例 #8
0
ファイル: Suffixed.cs プロジェクト: minorDeveloper/KOS
        public override void Execute(SharedObjects shared)
        {
            string vesselName = PopValueAssert(shared).ToString();

            AssertArgBottomAndConsume(shared);
            var result = new VesselTarget(VesselUtils.GetVesselByName(vesselName, shared.Vessel), shared);

            ReturnValue = result;
        }
コード例 #9
0
ファイル: FlightStats.cs プロジェクト: dewiniaid/KOS
        public object VesselShortcutGetter(SharedObjects shared, string name)
        {
            ISuffixResult suffix = new VesselTarget(shared).GetSuffix(name);

            if (!suffix.HasValue)
            {
                suffix.Invoke(shared.Cpu);
            }
            return(suffix.Value);
        }
コード例 #10
0
ファイル: Addon.cs プロジェクト: tony48/ksp-kipc
        private BooleanValue SendImmediate(VesselTarget target, Structure content)
        {
            double  sentAt              = Planetarium.GetUniversalTime();
            double  receivedAt          = sentAt;
            Message message             = Message.Create(content, sentAt, receivedAt, VesselTarget.CreateOrGetExisting(shared), shared.Processor.Tag);
            MessageQueueStructure queue = InterVesselManager.Instance.GetQueue(target.Vessel, shared);

            queue.Push(message);
            return(true);
        }
コード例 #11
0
ファイル: Addon.cs プロジェクト: stephengeorgewest/KOS-1
        private static ScalarValue RTGetDelay(VesselTarget tgtVessel)
        {
            double waitTotal = 0;

            if (RemoteTechHook.IsAvailable())
            {
                waitTotal = RemoteTechHook.Instance.GetShortestSignalDelay(tgtVessel.Vessel.id);
            }
            return(Double.IsPositiveInfinity(waitTotal) ? -1 : waitTotal);
        }
コード例 #12
0
ファイル: Addon.cs プロジェクト: tfischer4765/KOS
        private static double RTGetKSCDelay(VesselTarget tgtVessel)
        {
            double waitTotal = 0;

            if (RemoteTechHook.IsAvailable(tgtVessel.Vessel.id) && tgtVessel.Vessel.GetVesselCrew().Count == 0)
            {
                waitTotal = RemoteTechHook.Instance.GetSignalDelayToKSC(tgtVessel.Vessel.id);
            }

            return(waitTotal);
        }
コード例 #13
0
ファイル: Addon.cs プロジェクト: stephengeorgewest/KOS-1
        private static ScalarValue RTGetKSCDelay(VesselTarget tgtVessel)
        {
            double waitTotal = 0;

            if (RemoteTechHook.IsAvailable() && tgtVessel.Vessel.GetVesselCrew().Count == 0)
            {
                waitTotal = RemoteTechHook.Instance.GetSignalDelayToKSC(tgtVessel.Vessel.id);
            }

            return(Double.IsPositiveInfinity(waitTotal) ? -1 : waitTotal);
        }
コード例 #14
0
        public Structure GetVesselTarget()
        {
            Vessel vessel = GetVessel();

            if (vessel == null)
            {
                return(new BooleanValue(false));
            }

            return(VesselTarget.CreateOrGetExisting(vessel, shared));
        }
コード例 #15
0
ファイル: Addon.cs プロジェクト: jonored/KOS
        private static BooleanValue RTHasConnection(VesselTarget tgtVessel)
        {
            bool result = false;

            if (RemoteTechHook.IsAvailable(tgtVessel.Vessel.id))
            {
                result = RemoteTechHook.Instance.HasAnyConnection(tgtVessel.Vessel.id);
            }

            return(result);
        }
コード例 #16
0
ファイル: Addon.cs プロジェクト: tfischer4765/KOS
        private static bool RTHasLocalControl(VesselTarget tgtVessel)
        {
            bool result = false;

            if (RemoteTechHook.IsAvailable(tgtVessel.Vessel.id))
            {
                result = RemoteTechHook.Instance.HasLocalControl(tgtVessel.Vessel.id);
            }

            return(result);
        }
コード例 #17
0
        private PartValue GetPart()
        {
            var p = servo.HostPart;

            if (!p)
            {
                shared.Logger.LogError("Cannot find Infernal Robotics part with UID: " + servo.UID);
            }

            return(p != null?VesselTarget.CreateOrGetExisting(shared)[p] : null);
        }
コード例 #18
0
ファイル: Addon.cs プロジェクト: tfischer4765/KOS
        private static bool RTHasKSCConnection(VesselTarget tgtVessel)
        {
            bool result = false;

            if (RemoteTechHook.IsAvailable(tgtVessel.Vessel.id))
            {
                result = RemoteTechHook.Instance.HasConnectionToKSC(tgtVessel.Vessel.id);
            }

            return(result);
        }
コード例 #19
0
        public void SendToSwitchVesselNotifyees(Vessel fromVes, Vessel toVes)
        {
            UniqueSetValue <UserDelegate> notifyees = GetSwitchVesselNotifyees();

            foreach (UserDelegate del in notifyees)
            {
                if (UserDelgateIsAcceptable(del))
                {
                    Shared.Cpu.AddTrigger(del, VesselTarget.CreateOrGetExisting(fromVes, Shared), VesselTarget.CreateOrGetExisting(toVes, Shared));
                }
            }
        }
コード例 #20
0
 public VesselTarget GetVessel()
 {
     if (IRWrapper.APIReady)
     {
         //IF IR version is 0.21.4 or below IR API may return null, but it also means that IR API only returns groups for ActiveVessel
         //so returning the ActiveVessel should work
         return(cg.Vessel != null?VesselTarget.CreateOrGetExisting(cg.Vessel, shared) : VesselTarget.CreateOrGetExisting(FlightGlobals.ActiveVessel, shared));
     }
     else
     {
         return(VesselTarget.CreateOrGetExisting(shared.Vessel, shared)); //user should not be able to get here anyway, but to avoid null will return shared.Vessel
     }
 }
コード例 #21
0
        public static ListValue PartsToList(IEnumerable <global::Part> parts, SharedObjects sharedObj)
        {
            var toReturn = new ListValue();
            var vessel   = VesselTarget.CreateOrGetExisting(sharedObj);

            foreach (var part in parts)
            {
                if (part.Modules.Contains <ModuleEnviroSensor>())
                {
                    toReturn.Add(vessel[part]);
                }
            }
            return(toReturn);
        }
コード例 #22
0
ファイル: Addon.cs プロジェクト: tony48/kOS.Utils
        //private void Engage(VesselTarget vessel)
        //{
        //    predictors.Add(new KeyValuePair<Guid, Class1>(vessel.Vessel.id, new Class1(vessel.Vessel)));
        //   isEngaged = true;
        //}

        //private void Disengage(VesselTarget vessel)
        //{
        //    predictors.Find(kv => kv.Key == vessel.Vessel.id).Value.StopThread();
        //    predictors.Remove(new KeyValuePair<Guid, Class1>(vessel.Vessel.id, new Class1(vessel.Vessel)));
        //    isEngaged = false;
        //}

        public Vector3?GetImpactPosition(VesselTarget vessel)
        {
            Class1 pr = new Class1(vessel.Vessel);

            pr.ComputeTrajectory(vessel.Vessel, DescentProfile.fetch);
            foreach (Patch patch in pr.Patches)
            {
                if (patch.ImpactPosition != null)
                {
                    return(patch.ImpactPosition);
                }
            }
            return(null);
        }
コード例 #23
0
 public void PushMessage(Structure content)
 {
     if (content is MessageStructure)
     {
         MessageStructure m = content as MessageStructure;
         messageQueue.Push(m.Message);
     }
     else
     {
         double sentAt = Planetarium.GetUniversalTime();
         messageQueue.Push(Message.Create(content, sentAt, sentAt, VesselTarget.CreateOrGetExisting(sharedObjects.Vessel, sharedObjects),
                                          sharedObjects.Processor.Tag));
     }
 }
コード例 #24
0
        protected new Structure GetKSPFieldValue(StringValue suffixName)
        {
            if (Equals(suffixName, new StringValue(RTTargetField)))
            {
                var  api  = RemoteTechHook.Instance;
                Guid guid = api.GetAntennaTarget(partModule.part);

                if (guid.Equals(api.GetNoTargetGuid()))
                {
                    return(new StringValue(NoTargetString));
                }
                else if (guid.Equals(api.GetActiveVesselGuid()))
                {
                    return(new StringValue(ActiveVesselString));
                }
                else
                {
                    IEnumerable <string> groundStations = api.GetGroundStations();
                    foreach (var groundStation in groundStations)
                    {
                        if (guid.Equals(api.GetGroundStationGuid(groundStation)))
                        {
                            return(new StringValue(groundStation));
                        }
                    }
                }

                foreach (var body in FlightGlobals.Bodies)
                {
                    if (api.GetCelestialBodyGuid(body).Equals(guid))
                    {
                        return(BodyTarget.CreateOrGetExisting(body, shared));
                    }
                }

                foreach (var vessel in FlightGlobals.Vessels)
                {
                    if (vessel.id.Equals(guid))
                    {
                        return(VesselTarget.CreateOrGetExisting(vessel, shared));
                    }
                }

                // just print the guid if we can't figure out what it is
                return(new StringValue(guid.ToString()));
            }
            return(base.GetKSPFieldValue(suffixName));
        }
コード例 #25
0
        public override void AddTo(SharedObjects shared)
        {
            shared.BindingMgr.AddGetter("ALT", () => new VesselAlt(shared));
            shared.BindingMgr.AddGetter("ANGULARVELOCITY", () => shared.Vessel.transform.InverseTransformDirection(shared.Vessel.GetComponent <Rigidbody>().angularVelocity));
            shared.BindingMgr.AddGetter("ENCOUNTER", () => VesselUtils.TryGetEncounter(shared.Vessel, shared));
            shared.BindingMgr.AddGetter("ETA", () => new VesselEta(shared));
            shared.BindingMgr.AddGetter("MISSIONTIME", () => shared.Vessel.missionTime);
            shared.BindingMgr.AddGetter(new [] { "OBT", "ORBIT" }, () => new OrbitInfo(shared.Vessel.orbit, shared));
            // Note: "TIME" is both a bound variable AND a built-in function now.
            // While it would be cleaner to make it JUST a built -in function,
            // the bound variable had to be retained for backward compatibility with scripts
            // that call TIME without parentheses:
            shared.BindingMgr.AddGetter("TIME", () => new TimeSpan(Planetarium.GetUniversalTime()));
            shared.BindingMgr.AddGetter("ACTIVESHIP", () => VesselTarget.CreateOrGetExisting(FlightGlobals.ActiveVessel, shared));
            shared.BindingMgr.AddGetter("STATUS", () => shared.Vessel.situation.ToString());
            shared.BindingMgr.AddGetter("STAGE", () => shared.VesselTarget.StageValues);

            shared.BindingMgr.AddSetter("SHIPNAME", value => shared.Vessel.vesselName = value.ToString());

            shared.BindingMgr.AddGetter("STEERINGMANAGER", () => (SteeringManager)kOSVesselModule.GetInstance(shared.Vessel).GetFlightControlParameter("steering"));

            shared.BindingMgr.AddGetter("NEXTNODE", () =>
            {
                var vessel = shared.Vessel;
                if (vessel.patchedConicSolver == null)
                {
                    throw new KOSSituationallyInvalidException(
                        "A KSP limitation makes it impossible to access the maneuver nodes of this vessel at this time. " +
                        "(perhaps it's not the active vessel?)");
                }
                if (vessel.patchedConicSolver.maneuverNodes.Count == 0)
                {
                    throw new KOSSituationallyInvalidException("No maneuver nodes present!");
                }

                return(Node.FromExisting(vessel, vessel.patchedConicSolver.maneuverNodes[0], shared));
            });
            shared.BindingMgr.AddGetter("HASNODE", () =>
            {
                var vessel = shared.Vessel;
                if (vessel.patchedConicSolver == null)
                {
                    return(false); // Since there is no solver, there can be no node.
                }
                return(vessel.patchedConicSolver.maneuverNodes.Count > 0);
            });
            shared.BindingMgr.AddGetter("ALLNODES", () => GetAllNodes(shared));
        }
コード例 #26
0
        protected override BooleanValue SendMessage(Structure content)
        {
            if (!Connected)
            {
                return(false);
            }

            MessageQueueStructure queue = InterVesselManager.Instance.GetQueue(vessel, shared);

            double sentAt     = Planetarium.GetUniversalTime();
            double receivedAt = sentAt + Delay;

            queue.Push(Message.Create(content, sentAt, receivedAt, VesselTarget.CreateOrGetExisting(shared), shared.Processor.Tag));

            return(true);
        }
コード例 #27
0
ファイル: Addon.cs プロジェクト: tony48/kOS.Utils
        private GeoCoordinates ImpactPos(VesselTarget vessel)
        {
            //Class1 pr = new Class1(vessel.Vessel);
            //if(!isEngaged)
            //    throw new KOSException("please use engage");
            CelestialBody body       = vessel.Vessel.orbit.referenceBody;
            Vector3?      impactVect = GetImpactPosition(vessel);

            if (impactVect != null)
            {
                var worldImpactPos = (Vector3d)impactVect + body.position;
                var lat            = body.GetLatitude(worldImpactPos);
                var lng            = DegreeFix(body.GetLongitude(worldImpactPos), -180);
                return(new GeoCoordinates(vessel.Shared, lat, lng));
            }
            throw new KOSException("Impact position is null");
        }
コード例 #28
0
ファイル: EngineValue.cs プロジェクト: madman2003/KOS
        public static ListValue PartsToList(IEnumerable <global::Part> parts, SharedObjects sharedObj)
        {
            var toReturn = new ListValue();
            var vessel   = VesselTarget.CreateOrGetExisting(sharedObj);

            foreach (var part in parts)
            {
                foreach (var module in part.Modules)
                {
                    if (module is IEngineStatus)
                    {
                        toReturn.Add(vessel[part]);
                    }
                }
            }
            return(toReturn);
        }
コード例 #29
0
ファイル: PrintList.cs プロジェクト: jenden0/KOS
        private kList GetTargetList(SharedObjects shared)
        {
            var list = new kList();

            list.AddColumn("Vessel Name", 25, ColumnAlignment.Left);
            list.AddColumn("Distance", 12, ColumnAlignment.Right, "0.0");

            foreach (Vessel vessel in FlightGlobals.Vessels)
            {
                if (vessel != shared.Vessel)
                {
                    var vT = new VesselTarget(vessel, shared);
                    list.AddItem(vT.Vessel.vesselName, vT.GetDistance());
                }
            }

            return(list);
        }
コード例 #30
0
        private Structure GetCameraTarget()
        {
            var cam = FlightCamera.fetch;

            switch (cam.targetMode)
            {
            case FlightCamera.TargetMode.Vessel:
                return(VesselTarget.CreateOrGetExisting(cam.vesselTarget, shared));

            case FlightCamera.TargetMode.Part:
                return(Suffixed.Part.PartValueFactory.Construct(cam.partTarget, shared));

            case FlightCamera.TargetMode.Transform:
                throw new KOSException("Flight camera has target set to transform.  This is currently not supported.");

            case FlightCamera.TargetMode.None:
            default:
                throw new KOSException("Flight camera has no target set.  This should not ever happen, unless KSP changes their API.");
            }
        }