public override ListValue GetParts() { CreatePartSet(); return(PartValueFactory.Construct(partSet.GetParts().Where( e => e.Resources.Any( e2 => e2.info.id == resourceId)), shared)); }
private ListValue GetPartsTaggedPattern(StringValue tagPattern) { // Prepare case-insensivie regex. Regex r = new Regex(tagPattern, RegexOptions.IgnoreCase); return(PartValueFactory.Construct(GetRawPartsTaggedPattern(r), Shared)); }
public static ListValue PartList(this IShipconstruct vessel, string partType, SharedObjects sharedObj) { var list = new ListValue(); var partList = vessel.Parts.ToList(); switch (partType.ToUpper()) { case "RESOURCES": list = AggregateResourceValue.PartsToList(partList, sharedObj); break; case "PARTS": list = PartValueFactory.Construct(partList, sharedObj); break; case "ENGINES": list = EngineValue.PartsToList(partList, sharedObj); break; case "SENSORS": list = SensorValue.PartsToList(partList, sharedObj); break; case "ELEMENTS": list = ElementValue.PartsToList(partList); break; case "DOCKINGPORTS": list = DockingPortValue.PartsToList(partList, sharedObj); break; } return(list); }
public void SendToPartCouplingNotifyees(GameEvents.FromToAction <Part, Part> evt) { // Notify any hooks attached to the part on the "from" side of the event: UniqueSetValue <UserDelegate> notifyees = GetPartCoupleNotifyees(evt.@from); // Use GetFooNotifyees to activate the lazy-build logic if need be. foreach (UserDelegate del in notifyees) { if (UserDelgateIsAcceptable(del)) { Shared.Cpu.AddTrigger(del, PartValueFactory.Construct(evt.to, Shared)); } } // Also notify any hooks attached to the part on the "to" side of the event. Let's not // confuse users with KSP's strange notion of the "from" and the "to" of a docking, and just // treat both ports as equal peers that both get the same notification: notifyees = GetPartCoupleNotifyees(evt.to); foreach (UserDelegate del in notifyees) { if (UserDelgateIsAcceptable(del)) { Shared.Cpu.AddTrigger(del, PartValueFactory.Construct(evt.@from, Shared)); } } }
/// <summary> /// Get all the parts which have at least SOME non-default name: /// </summary> /// <returns></returns> private ListValue GetAllTaggedParts() { IEnumerable <global::Part> partsWithName = Vessel.parts .Where(p => p.Modules.OfType <KOSNameTag>() .Any(tag => !String.Equals(tag.nameTag, "", StringComparison.CurrentCultureIgnoreCase))); return(PartValueFactory.Construct(partsWithName, Shared)); }
private void InitializeSuffixes() { AddSuffix("PARTSNAMED", new OneArgsSuffix <ListValue, string>(GetPartsNamed)); AddSuffix("PARTSTITLED", new OneArgsSuffix <ListValue, string>(GetPartsTitled)); AddSuffix("PARTSDUBBED", new OneArgsSuffix <ListValue, string>(GetPartsDubbed)); AddSuffix("MODULESNAMED", new OneArgsSuffix <ListValue, string>(GetModulesNamed)); AddSuffix("PARTSINGROUP", new OneArgsSuffix <ListValue, string>(GetPartsInGroup)); AddSuffix("MODULESINGROUP", new OneArgsSuffix <ListValue, string>(GetModulesInGroup)); AddSuffix("PARTSTAGGED", new OneArgsSuffix <ListValue, string>(GetPartsTagged)); AddSuffix("ALLTAGGEDPARTS", new NoArgsSuffix <ListValue>(GetAllTaggedParts)); AddSuffix("PARTS", new NoArgsSuffix <ListValue>(GetAllParts)); AddSuffix("DOCKINGPORTS", new NoArgsSuffix <ListValue>(() => Vessel.PartList("dockingports", Shared))); AddSuffix("ELEMENTS", new NoArgsSuffix <ListValue>(() => Vessel.PartList("elements", Shared))); AddSuffix("CONTROL", new Suffix <FlightControl>(() => FlightControlManager.GetControllerByVessel(Vessel))); AddSuffix("BEARING", new Suffix <float>(() => VesselUtils.GetTargetBearing(CurrentVessel, Vessel))); AddSuffix("HEADING", new Suffix <float>(() => VesselUtils.GetTargetHeading(CurrentVessel, Vessel))); AddSuffix("AVAILABLETHRUST", new Suffix <double>(() => VesselUtils.GetAvailableThrust(Vessel))); AddSuffix("AVAILABLETHRUSTAT", new OneArgsSuffix <double, double>(GetAvailableThrustAt)); AddSuffix("MAXTHRUST", new Suffix <double>(() => VesselUtils.GetMaxThrust(Vessel))); AddSuffix("MAXTHRUSTAT", new OneArgsSuffix <double, double>(GetMaxThrustAt)); AddSuffix("FACING", new Suffix <Direction>(() => VesselUtils.GetFacing(Vessel))); AddSuffix("ANGULARMOMENTUM", new Suffix <Vector>(() => new Vector(Vessel.angularMomentum))); AddSuffix("ANGULARVEL", new Suffix <Vector>(() => RawAngularVelFromRelative(Vessel.angularVelocity))); AddSuffix("MASS", new Suffix <float>(() => Vessel.GetTotalMass())); AddSuffix("VERTICALSPEED", new Suffix <double>(() => Vessel.verticalSpeed)); AddSuffix("SURFACESPEED", new Suffix <double>(() => Vessel.horizontalSrfSpeed)); AddSuffix("AIRSPEED", new Suffix <double>(() => (Vessel.orbit.GetVel() - FlightGlobals.currentMainBody.getRFrmVel(Vessel.findWorldCenterOfMass())).magnitude, "the velocity of the vessel relative to the air")); AddSuffix(new[] { "SHIPNAME", "NAME" }, new SetSuffix <string>(() => Vessel.vesselName, RenameVessel, "The KSP name for a craft, cannot be empty")); AddSuffix("TYPE", new SetSuffix <string>(() => Vessel.vesselType.ToString(), RetypeVessel, "The Ship's KSP type (e.g. rover, base, probe)")); AddSuffix("SENSORS", new Suffix <VesselSensors>(() => new VesselSensors(Vessel))); AddSuffix("TERMVELOCITY", new Suffix <double>(() => { throw new KOSAtmosphereDeprecationException("17.2", "TERMVELOCITY", "<None>", string.Empty); })); AddSuffix("LOADED", new Suffix <bool>(() => Vessel.loaded)); AddSuffix("ROOTPART", new Suffix <PartValue>(() => PartValueFactory.Construct(Vessel.rootPart, Shared))); AddSuffix("DRYMASS", new Suffix <float>(() => Vessel.GetDryMass(), "The Ship's mass when empty")); AddSuffix("WETMASS", new Suffix <float>(Vessel.GetWetMass, "The Ship's mass when full")); AddSuffix("RESOURCES", new Suffix <ListValue <AggregateResourceValue> >(() => AggregateResourceValue.FromVessel(Vessel, Shared), "The Aggregate resources from every part on the craft")); AddSuffix("PACKDISTANCE", new SetSuffix <float>( () => { return(System.Math.Min(Vessel.vesselRanges.landed.pack, Vessel.vesselRanges.prelaunch.pack)); }, value => { Vessel.vesselRanges.landed.pack = value; Vessel.vesselRanges.splashed.pack = value; Vessel.vesselRanges.prelaunch.pack = value; })); AddSuffix("ISDEAD", new NoArgsSuffix <bool>(() => (Vessel.state == Vessel.State.DEAD))); AddSuffix("STATUS", new Suffix <String>(() => Vessel.situation.ToString())); //// Although there is an implementation of lat/long/alt in Orbitible, //// it's better to use the methods for vessels that are faster if they're //// available: AddSuffix("LATITUDE", new Suffix <float>(() => VesselUtils.GetVesselLatitude(Vessel))); AddSuffix("LONGITUDE", new Suffix <double>(() => VesselUtils.GetVesselLongitude(Vessel))); AddSuffix("ALTITUDE", new Suffix <double>(() => Vessel.altitude)); }
private void InitializeSuffixes() { AddSuffix("NAME", new SetSuffix <StringValue>(() => dockedVesselInfo.name, SetName)); AddSuffix("UID", new Suffix <StringValue>(() => dockedVesselInfo.rootPartUId.ToString())); AddSuffix("VESSEL", new Suffix <VesselTarget>(() => new VesselTarget(parts[0].vessel, shared))); AddSuffix("PARTS", new Suffix <ListValue>(() => PartValueFactory.Construct(parts, shared))); AddSuffix("DOCKINGPORTS", new Suffix <ListValue>(() => DockingPortValue.PartsToList(parts, shared))); AddSuffix("RESOURCES", new Suffix <ListValue>(GetResourceManifest)); }
private void InitializeSuffixes() { AddSuffix("NAME", new Suffix <StringValue>(() => Name)); AddSuffix("TOURIST", new Suffix <BooleanValue>(() => crewMember.type == ProtoCrewMember.KerbalType.Tourist)); AddSuffix("GENDER", new Suffix <StringValue>(() => Gender)); AddSuffix("TRAIT", new Suffix <StringValue>(() => Trait)); AddSuffix("EXPERIENCE", new Suffix <ScalarValue>(() => Experience)); AddSuffix("PART", new Suffix <PartValue>(() => PartValueFactory.Construct(crewMember.seat.part, shared))); }
private void InitializeSuffixes() { AddSuffix("PARTSNAMED", new OneArgsSuffix <ListValue, StringValue>(GetPartsNamed)); AddSuffix("PARTSTITLED", new OneArgsSuffix <ListValue, StringValue>(GetPartsTitled)); AddSuffix("PARTSDUBBED", new OneArgsSuffix <ListValue, StringValue>(GetPartsDubbed)); AddSuffix("MODULESNAMED", new OneArgsSuffix <ListValue, StringValue>(GetModulesNamed)); AddSuffix("PARTSINGROUP", new OneArgsSuffix <ListValue, StringValue>(GetPartsInGroup)); AddSuffix("MODULESINGROUP", new OneArgsSuffix <ListValue, StringValue>(GetModulesInGroup)); AddSuffix("PARTSTAGGED", new OneArgsSuffix <ListValue, StringValue>(GetPartsTagged)); AddSuffix("ALLTAGGEDPARTS", new NoArgsSuffix <ListValue>(GetAllTaggedParts)); AddSuffix("PARTS", new NoArgsSuffix <ListValue>(GetAllParts)); AddSuffix("DOCKINGPORTS", new NoArgsSuffix <ListValue>(() => Vessel.PartList("dockingports", Shared))); AddSuffix("ELEMENTS", new NoArgsSuffix <ListValue>(() => Vessel.PartList("elements", Shared))); AddSuffix("CONTROL", new Suffix <FlightControl>(GetFlightControl)); AddSuffix("BEARING", new Suffix <ScalarValue>(() => VesselUtils.GetTargetBearing(CurrentVessel, Vessel))); AddSuffix("HEADING", new Suffix <ScalarValue>(() => VesselUtils.GetTargetHeading(CurrentVessel, Vessel))); AddSuffix("AVAILABLETHRUST", new Suffix <ScalarValue>(() => VesselUtils.GetAvailableThrust(Vessel))); AddSuffix("AVAILABLETHRUSTAT", new OneArgsSuffix <ScalarValue, ScalarValue>(GetAvailableThrustAt)); AddSuffix("MAXTHRUST", new Suffix <ScalarValue>(() => VesselUtils.GetMaxThrust(Vessel))); AddSuffix("MAXTHRUSTAT", new OneArgsSuffix <ScalarValue, ScalarValue>(GetMaxThrustAt)); AddSuffix("FACING", new Suffix <Direction>(() => VesselUtils.GetFacing(Vessel))); AddSuffix("ANGULARMOMENTUM", new Suffix <Vector>(() => new Vector(Vessel.angularMomentum))); AddSuffix("ANGULARVEL", new Suffix <Vector>(() => RawAngularVelFromRelative(Vessel.angularVelocity))); AddSuffix("MASS", new Suffix <ScalarValue>(() => Vessel.GetTotalMass())); AddSuffix("VERTICALSPEED", new Suffix <ScalarValue>(() => Vessel.verticalSpeed)); AddSuffix("GROUNDSPEED", new Suffix <ScalarValue>(GetHorizontalSrfSpeed)); AddSuffix("SURFACESPEED", new Suffix <ScalarValue>(() => { throw new KOSObsoletionException("0.18.0", "SURFACESPEED", "GROUNDSPEED", ""); })); AddSuffix("AIRSPEED", new Suffix <ScalarValue>(() => (Vessel.orbit.GetVel() - FlightGlobals.currentMainBody.getRFrmVel(Vessel.CoMD)).magnitude, "the velocity of the vessel relative to the air")); AddSuffix(new[] { "SHIPNAME", "NAME" }, new SetSuffix <StringValue>(() => Vessel.vesselName, RenameVessel, "The KSP name for a craft, cannot be empty")); AddSuffix("TYPE", new SetSuffix <StringValue>(() => Vessel.vesselType.ToString(), RetypeVessel, "The Ship's KSP type (e.g. rover, base, probe)")); AddSuffix("SENSORS", new Suffix <VesselSensors>(() => new VesselSensors(Vessel))); AddSuffix("TERMVELOCITY", new Suffix <ScalarValue>(() => { throw new KOSAtmosphereObsoletionException("17.2", "TERMVELOCITY", "<None>", string.Empty); })); AddSuffix(new [] { "DYNAMICPRESSURE", "Q" }, new Suffix <ScalarValue>(() => Vessel.dynamicPressurekPa * ConstantValue.KpaToAtm, "Dynamic Pressure in Atmospheres")); AddSuffix("LOADED", new Suffix <BooleanValue>(() => Vessel.loaded)); AddSuffix("UNPACKED", new Suffix <BooleanValue>(() => !Vessel.packed)); AddSuffix("ROOTPART", new Suffix <PartValue>(() => PartValueFactory.Construct(Vessel.rootPart, Shared))); AddSuffix("CONTROLPART", new Suffix <PartValue>(() => PartValueFactory.Construct(GetControlPart(), Shared))); AddSuffix("DRYMASS", new Suffix <ScalarValue>(() => Vessel.GetDryMass(), "The Ship's mass when empty")); AddSuffix("WETMASS", new Suffix <ScalarValue>(() => Vessel.GetWetMass(), "The Ship's mass when full")); AddSuffix("RESOURCES", new Suffix <ListValue <AggregateResourceValue> >(() => AggregateResourceValue.FromVessel(Vessel, Shared), "The Aggregate resources from every part on the craft")); AddSuffix("LOADDISTANCE", new Suffix <LoadDistanceValue>(() => new LoadDistanceValue(Vessel))); AddSuffix("ISDEAD", new NoArgsSuffix <BooleanValue>(() => (Vessel.state == Vessel.State.DEAD))); AddSuffix("STATUS", new Suffix <StringValue>(() => Vessel.situation.ToString())); //// Although there is an implementation of lat/long/alt in Orbitible, //// it's better to use the methods for vessels that are faster if they're //// available: AddSuffix("LATITUDE", new Suffix <ScalarValue>(() => VesselUtils.GetVesselLatitude(Vessel))); AddSuffix("LONGITUDE", new Suffix <ScalarValue>(() => VesselUtils.GetVesselLongitude(Vessel))); AddSuffix("ALTITUDE", new Suffix <ScalarValue>(() => Vessel.altitude)); AddSuffix("CREW", new NoArgsSuffix <ListValue>(GetCrew)); AddSuffix("CREWCAPACITY", new NoArgsSuffix <ScalarValue>(GetCrewCapacity)); AddSuffix("CONNECTION", new NoArgsSuffix <VesselConnection>(() => new VesselConnection(Vessel, Shared))); AddSuffix("MESSAGES", new NoArgsSuffix <MessageQueueStructure>(() => GetMessages())); }
private void InitializeSuffixes() { AddSuffix("NAME", new SetSuffix <StringValue>(() => dockedVesselInfo.name, SetName)); AddSuffix("UID", new Suffix <StringValue>(() => dockedVesselInfo.rootPartUId.ToString())); AddSuffix("VESSEL", new Suffix <VesselTarget>(() => VesselTarget.CreateOrGetExisting(parts[0].vessel, shared))); AddSuffix("PARTS", new Suffix <ListValue>(() => PartValueFactory.Construct(parts, shared))); AddSuffix("DOCKINGPORTS", new Suffix <ListValue>(() => DockingPortValue.PartsToList(parts, shared))); AddSuffix(new string[] { "DECOUPLERS", "SEPARATORS" }, new Suffix <ListValue>(() => DecouplerValue.PartsToList(parts, shared))); AddSuffix("RESOURCES", new Suffix <ListValue>(GetResourceManifest)); }
private ListValue GetPartsDubbed(StringValue searchTerm) { // Get the list of all the parts where the part's API name OR its GUI title or its tag name matches. List <global::Part> kspParts = new List <global::Part>(); kspParts.AddRange(GetRawPartsNamed(searchTerm)); kspParts.AddRange(GetRawPartsTitled(searchTerm)); kspParts.AddRange(GetRawPartsTagged(searchTerm)); // The "Distinct" operation is there because it's possible for someone to use a tag name that matches the part name. return(PartValueFactory.Construct(kspParts.Distinct(), Shared)); }
private ListValue GetPartsDubbedPattern(StringValue searchPattern) { // Prepare case-insensivie regex. Regex r = new Regex(searchPattern, RegexOptions.IgnoreCase); // Get the list of all the parts where the part's API name OR its GUI title or its tag name matches the pattern. List <global::Part> kspParts = new List <global::Part>(); kspParts.AddRange(GetRawPartsNamedPattern(r)); kspParts.AddRange(GetRawPartsTitledPattern(r)); kspParts.AddRange(GetRawPartsTaggedPattern(r)); // The "Distinct" operation is there because it's possible for someone to use a tag name that matches the part name. return(PartValueFactory.Construct(kspParts.Distinct(), Shared)); }
private void InitializeSuffixesAfterConstruction() { AddSuffix("NAME", new Suffix <string>(() => partModule.moduleName)); AddSuffix("PART", new Suffix <PartValue>(() => PartValueFactory.Construct(partModule.part, shared))); AddSuffix("ALLFIELDS", new Suffix <ListValue>(() => AllFields("({0}) {1}, is {2}"))); AddSuffix("HASFIELD", new OneArgsSuffix <bool, string>(HasField)); AddSuffix("ALLEVENTS", new Suffix <ListValue>(() => AllEvents("({0}) {1}, is {2}"))); AddSuffix("HASEVENT", new OneArgsSuffix <bool, string>(HasEvent)); AddSuffix("ALLACTIONS", new Suffix <ListValue>(() => AllActions("({0}) {1}, is {2}"))); AddSuffix("HASACTION", new OneArgsSuffix <bool, string>(HasAction)); AddSuffix("GETFIELD", new OneArgsSuffix <object, string>(GetKSPFieldValue)); AddSuffix("SETFIELD", new TwoArgsSuffix <string, object>(SetKSPFieldValue)); AddSuffix("DOEVENT", new OneArgsSuffix <string>(CallKSPEvent)); AddSuffix("DOACTION", new TwoArgsSuffix <string, bool>(CallKSPAction)); }
public ListValue GetAllParts() { if (cachedPartsAreStale) { cachedParts.Clear(); for (int i = 0; i < Vessel.Parts.Count; ++i) { var part = Vessel.Parts[i]; if (part.State != PartStates.DEAD && part.transform != null) { cachedParts.Add(PartValueFactory.Construct(Vessel.Parts[i], Shared)); } } cachedPartsAreStale = false; } return(cachedParts); }
private ListValue GetPartsTitledPattern(StringValue partTitlePattern) { return(PartValueFactory.Construct(Vessel.rootPart, Shared).GetPartsTitledPattern(partTitlePattern)); }
private ListValue GetPartsTagged(StringValue tagName) { return(PartValueFactory.Construct(Vessel.rootPart, Shared).GetPartsTagged(tagName)); }
private ListValue GetPartsTagged(StringValue tagName) { return(PartValueFactory.Construct(GetRawPartsTagged(tagName), Shared)); }
private ListValue GetPartsTitled(StringValue partTitle) { return(PartValueFactory.Construct(GetRawPartsTitled(partTitle), Shared)); }
private ListValue GetPartsDubbedPattern(StringValue searchPattern) { return(PartValueFactory.Construct(Vessel.rootPart, Shared).GetPartsDubbedPattern(searchPattern)); }
private ListValue GetPartsTaggedPattern(StringValue tagPattern) { return(PartValueFactory.Construct(Vessel.rootPart, Shared).GetPartsTaggedPattern(tagPattern)); }
private ListValue <PartValue> GetParts() { var parts = PartValueFactory.Construct(resources.Select(r => r.part), shared); return(ListValue <PartValue> .CreateList(parts)); }
private ListValue GetPartsDubbed(StringValue searchTerm) { return(PartValueFactory.Construct(Vessel.rootPart, Shared).GetPartsDubbed(searchTerm)); }
/// <summary> /// Get all the parts which have at least SOME non-default name: /// </summary> /// <returns></returns> private ListValue GetAllTaggedParts() { return(PartValueFactory.Construct(Vessel.rootPart, Shared).GetAllTaggedParts()); }
private ListValue GetPartsNamed(string partName) { return(PartValueFactory.Construct(GetRawPartsNamed(partName), Shared)); }
private ListValue GetPartsInGroup(StringValue groupName) { var matchGroup = KSPActionGroup.None; string upperName = groupName.ToUpper(); // TODO: later refactor: put this in a Dictionary lookup instead, and then share it // by both this code and the code in ActionGroup.cs: if (upperName == "SAS") { matchGroup = KSPActionGroup.SAS; } if (upperName == "GEAR") { matchGroup = KSPActionGroup.Gear; } if (upperName == "LIGHTS") { matchGroup = KSPActionGroup.Light; } if (upperName == "BRAKES") { matchGroup = KSPActionGroup.Brakes; } if (upperName == "RCS") { matchGroup = KSPActionGroup.RCS; } if (upperName == "ABORT") { matchGroup = KSPActionGroup.Abort; } if (upperName == "AG1") { matchGroup = KSPActionGroup.Custom01; } if (upperName == "AG2") { matchGroup = KSPActionGroup.Custom02; } if (upperName == "AG3") { matchGroup = KSPActionGroup.Custom03; } if (upperName == "AG4") { matchGroup = KSPActionGroup.Custom04; } if (upperName == "AG5") { matchGroup = KSPActionGroup.Custom05; } if (upperName == "AG6") { matchGroup = KSPActionGroup.Custom06; } if (upperName == "AG7") { matchGroup = KSPActionGroup.Custom07; } if (upperName == "AG8") { matchGroup = KSPActionGroup.Custom08; } if (upperName == "AG9") { matchGroup = KSPActionGroup.Custom09; } if (upperName == "AG10") { matchGroup = KSPActionGroup.Custom10; } ListValue kScriptParts = new ListValue(); if (matchGroup == KSPActionGroup.None) { return(kScriptParts); } foreach (global::Part p in Vessel.parts) { // See if any of the parts' actions are this action group: bool hasPartAction = p.Actions.Any(a => a.actionGroup.Equals(matchGroup)); if (hasPartAction) { kScriptParts.Add(PartValueFactory.Construct(p, Shared)); continue; } var modules = p.Modules.Cast <PartModule>(); bool hasModuleAction = modules.Any(pm => pm.Actions.Any(a => a.actionGroup.Equals(matchGroup))); if (hasModuleAction) { kScriptParts.Add(PartValueFactory.Construct(p, Shared)); } } return(kScriptParts); }
private ListValue GetPartsNamed(StringValue partName) { return(PartValueFactory.Construct(Vessel.rootPart, Shared).GetPartsNamed(partName)); }
public ListValue GetAllParts() { return(PartValueFactory.Construct(Vessel.Parts, Shared)); }
public virtual ListValue GetParts() { return(PartValueFactory.Construct(resources.Select(r => r.part), shared)); }
private ListValue GetModulesNamed(StringValue modName) { return(PartValueFactory.Construct(Vessel.rootPart, Shared).GetModulesNamed(modName)); }