private static void AddPropertyAndSyncEntityId(string id, out ValueSync <long, AutopilotTerminal> sync, string fieldName) { MyTerminalControlProperty <MyShipController, string> property = new MyTerminalControlProperty <MyShipController, string>(id); FieldInfo field = typeof(AutopilotTerminal).GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); sync = new ValueSync <long, AutopilotTerminal>(id, GenerateGetter <long>(field), GenerateSetter <long>(field), false); ValueSync <long, AutopilotTerminal> syncRef = sync; property.Getter = (block) => { AutopilotTerminal autopilot; if (!Registrar.TryGetValue(block, out autopilot)) { if (!Globals.WorldClosed) { Logger.AlwaysLog("failed lookup of block: " + block.getBestName(), Logger.severity.WARNING); } return(default(string)); } long entityId = syncRef.GetValue(autopilot); IMyEntity entity; if (!MyAPIGateway.Entities.TryGetEntityById(entityId, out entity)) { Logger.DebugLog("Failed to get entity for " + entityId, Logger.severity.WARNING); return("Unknown Entity"); } return(entity.GetNameForDisplay(autopilot.m_block.OwnerId)); }; AddControl(property, false); }
private void AddOffsetSlider(string id, string title, string toolTip, int dim) { MyTerminalControlSlider <MySpaceProjector> control = new MyTerminalControlSlider <MySpaceProjector>(id, MyStringId.GetOrCompute(title), MyStringId.GetOrCompute(toolTip)); ValueSync <float, Projector> tvs = new ValueSync <float, Projector>(control, (proj) => proj.m_offset_ev.GetDim(dim), (proj, value) => proj.m_offset_ev.SetDim(dim, value)); control.DefaultValue = dim == 1 ? 2.5f : 0f; control.Normalizer = (block, value) => Normalizer(MinOffset, MaxOffset, block, value); control.Denormalizer = (block, value) => Denormalizer(MinOffset, MaxOffset, block, value); control.Writer = (block, sb) => WriterMetres(tvs.GetValue(block), sb); TermControls_Offset.Add(control); }
private static void AddPropertyAndSync <T>(string id, out ValueSync <T, AutopilotTerminal> sync, string fieldName) { MyTerminalControlProperty <MyShipController, T> property = new MyTerminalControlProperty <MyShipController, T>(id); FieldInfo field = typeof(AutopilotTerminal).GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); sync = new ValueSync <T, AutopilotTerminal>(id, GenerateGetter <T>(field), GenerateSetter <T>(field), false); ValueSync <T, AutopilotTerminal> syncRef = sync; property.Getter = syncRef.GetValue; AddControl(property, false); }
private static void HijackShoot() { TerminalControlHelper.EnsureTerminalControlCreated <MySmallMissileLauncher>(); Func <object, bool> False = (o) => false; foreach (ITerminalControl control in MyTerminalControlFactory.GetControls(typeof(MyUserControllableGun))) { if (control.Id == "ShootOnce") { MyTerminalControlButton <MyUserControllableGun> shootOnce = (MyTerminalControlButton <MyUserControllableGun>)control; EventSync <GuidedMissileLauncher> termControl_shootOnce = new EventSync <GuidedMissileLauncher>(shootOnce.Id, ShootOnceEvent, false); Action <MyUserControllableGun> originalAction = shootOnce.Action; shootOnce.Action = block => { if (IsGuidedMissileLauncher(block)) { termControl_shootOnce.RunEvent(block); } else { originalAction(block); } }; shootOnce.Actions[0].Action = shootOnce.Action; } else if (control.Id == "Shoot") { MyTerminalControlOnOffSwitch <MyUserControllableGun> shoot = (MyTerminalControlOnOffSwitch <MyUserControllableGun>)control; termControl_shoot = new ValueSync <bool, GuidedMissileLauncher>(shoot.Id, "value_termShoot"); var originalGetter = shoot.Getter; var originalSetter = shoot.Setter; shoot.Getter = (block) => { if (IsGuidedMissileLauncher(block)) { return(termControl_shoot.GetValue(block)); } else { return(originalGetter(block)); } }; shoot.Setter = (block, value) => { if (IsGuidedMissileLauncher(block)) { Logger.TraceLog("Set shoot: " + value); termControl_shoot.SetValue(block, value); } else { originalSetter(block, value); } }; shoot.Actions[0].Action = block => shoot.SetValue(block, !shoot.GetValue(block)); // toggle shoot.Actions[1].Action = block => shoot.SetValue(block, true); // on shoot.Actions[2].Action = block => shoot.SetValue(block, false); // off break; } } }
public StaticVariables() { Logger.DebugLog("entered", Logger.severity.TRACE); MyAPIGateway.Session.DamageSystem.RegisterAfterDamageHandler((int)MyDamageSystemPriority.Low, AfterDamageHandler); TerminalControlHelper.EnsureTerminalControlCreated <MySpaceProjector>(); TermControls.Add(new MyTerminalControlSeparator <MySpaceProjector>()); AddCheckbox("HoloDisplay", "Holographic Display", "Holographically display this ship and nearby detected ships", Option.OnOff); AddCheckbox("HD_This_Ship", "This Ship", "Holographically display this ship", Option.ThisShip); AddCheckbox("HD_Owner", "Owned Ships", "Holographically display ships owned by this block's owner", Option.Owner); AddCheckbox("HD_Faction", "Faction Ships", "Holographically display faction owned ships", Option.Faction); AddCheckbox("HD_Neutral", "Neutral Ships", "Holographically display neutral ships", Option.Neutral); AddCheckbox("HD_Enemy", "Enemy Ships", "Holographically display enemy ships", Option.Enemy); MyTerminalControlSlider <MySpaceProjector> slider = new MyTerminalControlSlider <MySpaceProjector>("HD_RangeDetection", MyStringId.GetOrCompute("Detection Range"), MyStringId.GetOrCompute("Maximum distance of detected entity")); ValueSync <float, Projector> tvsRange = new ValueSync <float, Projector>(slider, (proj) => proj.m_rangeDetection, (proj, value) => proj.m_rangeDetection = value); slider.DefaultValue = DefaultRangeDetection; slider.Normalizer = (block, value) => Normalizer(MinRangeDetection, MaxRangeDetection, block, value); slider.Denormalizer = (block, value) => Denormalizer(MinRangeDetection, MaxRangeDetection, block, value); slider.Writer = (block, sb) => WriterMetres(tvsRange.GetValue(block), sb); TermControls.Add(slider); slider = new MyTerminalControlSlider <MySpaceProjector>("HD_RadiusHolo", MyStringId.GetOrCompute("Hologram Radius"), MyStringId.GetOrCompute("Maximum radius of hologram")); ValueSync <float, Projector> tvsRadius = new ValueSync <float, Projector>(slider, (proj) => proj.m_radiusHolo, (proj, value) => proj.m_radiusHolo = value); slider.DefaultValue = DefaultRadiusHolo; slider.Normalizer = (block, value) => Normalizer(MinRadiusHolo, MaxRadiusHolo, block, value); slider.Denormalizer = (block, value) => Denormalizer(MinRadiusHolo, MaxRadiusHolo, block, value); slider.Writer = (block, sb) => WriterMetres(tvsRadius.GetValue(block), sb); TermControls.Add(slider); slider = new MyTerminalControlSlider <MySpaceProjector>("HD_EntitySizeScale", MyStringId.GetOrCompute("Entity Size Scale"), MyStringId.GetOrCompute("Larger value causes entities to appear larger")); ValueSync <float, Projector> tvsScale = new ValueSync <float, Projector>(slider, (proj) => proj.m_sizeDistScale, (proj, value) => proj.m_sizeDistScale = value); slider.DefaultValue = DefaultSizeScale; slider.Normalizer = (block, value) => Normalizer(MinSizeScale, MaxSizeScale, block, value); slider.Denormalizer = (block, value) => Denormalizer(MinSizeScale, MaxSizeScale, block, value); slider.Writer = (block, sb) => sb.Append(tvsScale.GetValue(block)); TermControls.Add(slider); TermControls.Add(new MyTerminalControlSeparator <MySpaceProjector>()); MyTerminalControlCheckbox <MySpaceProjector> control = new MyTerminalControlCheckbox <MySpaceProjector>("HD_MouseControls", MyStringId.GetOrCompute("Mouse Controls"), MyStringId.GetOrCompute("Allow manipulation of hologram with mouse. User-specific setting.")); IMyTerminalValueControl <bool> valueControlBool = control; valueControlBool.Getter = block => MouseControls; valueControlBool.Setter = (block, value) => MouseControls = value; TermControls.Add(control); control = new MyTerminalControlCheckbox <MySpaceProjector>("HD_ShowBoundary", MyStringId.GetOrCompute("Show Boundary"), MyStringId.GetOrCompute("Show the boundaries of the hologram. User-specific setting.")); valueControlBool = control; valueControlBool.Getter = block => ShowBoundary; valueControlBool.Setter = (block, value) => ShowBoundary = value; TermControls.Add(control); control = new MyTerminalControlCheckbox <MySpaceProjector>("HD_ShowOffset", MyStringId.GetOrCompute("Show Offset Controls"), MyStringId.GetOrCompute("Display controls that can be used to adjust the position of the hologram. User-specific setting.")); control.Getter = block => ShowOffset; control.Setter = (block, value) => { ShowOffset = value; block.RebuildControls(); }; TermControls.Add(control); AddOffsetSlider("HD_OffsetX", "Right/Left Offset", "+ve moves hologram to the right, -ve moves hologram to the left", 0); AddOffsetSlider("HD_OffsetY", "Up/Down Offset", "+ve moves hologram up, -ve moves hologram down", 1); AddOffsetSlider("HD_OffsetZ", "Back/Fore Offset", "+ve moves hologram back, -ve moves hologram forward", 2); TermControls_Offset.Add(new MyTerminalControlSeparator <MySpaceProjector>()); AddCheckbox("HD_IntegrityColour", "Colour by Integrity", "Colour blocks according to their integrities", Option.IntegrityColours); IMyTerminalControlColor colour = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlColor, IMyProjector>("HD_FullIntegriyColour"); colour.Title = MyStringId.GetOrCompute("Whole"); colour.Tooltip = MyStringId.GetOrCompute("Colour when block has full integrity. User-specific setting."); colour.Getter = (block) => IntegrityFull; colour.Setter = (block, value) => IntegrityFull = value; TermControls_Colours.Add(colour); colour = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlColor, IMyProjector>("HD_CriticalIntegriyColour"); colour.Title = MyStringId.GetOrCompute("Func."); colour.Tooltip = MyStringId.GetOrCompute("Colour when block is just above critical integrity. User-specific setting."); colour.Getter = (block) => IntegrityFunctional; colour.Setter = (block, value) => IntegrityFunctional = value; TermControls_Colours.Add(colour); colour = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlColor, IMyProjector>("HD_CriticalIntegriyColour"); colour.Title = MyStringId.GetOrCompute("Broken"); colour.Tooltip = MyStringId.GetOrCompute("Colour when block is just below critical integrity. User-specific setting."); colour.Getter = (block) => IntegrityDamaged; colour.Setter = (block, value) => IntegrityDamaged = value; TermControls_Colours.Add(colour); colour = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlColor, IMyProjector>("HD_ZeroIntegriyColour"); colour.Title = MyStringId.GetOrCompute("Razed"); colour.Tooltip = MyStringId.GetOrCompute("Colour when block has zero integrity. User-specific setting."); colour.Getter = (block) => IntegrityZero; colour.Setter = (block, value) => IntegrityZero = value; TermControls_Colours.Add(colour); new ValueSync <long, Projector>("CentreEntity", (script) => script.m_centreEntityId, (script, value) => { script.m_centreEntityId = value; script.m_centreEntityId_AfterValueChanged(); }); }
public StaticVariables() { Logger.DebugLog("entered", Logger.severity.TRACE); TerminalControlHelper.EnsureTerminalControlCreated <MyCockpit>(); TerminalControlHelper.EnsureTerminalControlCreated <MyRemoteControl>(); AddControl(new MyTerminalControlSeparator <MyShipController>() { Enabled = ShipAutopilot.IsAutopilotBlock, Visible = ShipAutopilot.IsAutopilotBlock }); autopilotControl = new MyTerminalControlCheckbox <MyShipController>("ArmsAp_OnOff", MyStringId.GetOrCompute("ARMS Autopilot"), MyStringId.GetOrCompute("Enable ARMS Autopilot")); new ValueSync <bool, AutopilotTerminal>(autopilotControl, "value_autopilotControl"); AddControl(autopilotControl); AddAction(new MyTerminalAction <MyShipController>("ArmsAp_OnOff", new StringBuilder("ARMS Autopilot On/Off"), @"Textures\GUI\Icons\Actions\Toggle.dds") { Action = ToggleAutopilotControl }); AddAction(new MyTerminalAction <MyShipController>("ArmsAp_On", new StringBuilder("ARMS Autopilot On"), @"Textures\GUI\Icons\Actions\SwitchOn.dds") { Action = block => SetAutopilotControl(block, true) }); AddAction(new MyTerminalAction <MyShipController>("ArmsAp_Off", new StringBuilder("ARMS Autopilot Off"), @"Textures\GUI\Icons\Actions\SwitchOff.dds") { Action = block => SetAutopilotControl(block, false) }); autopilotCommands = new MyTerminalControlTextbox <MyShipController>("ArmsAp_Commands", MyStringId.GetOrCompute("Autopilot Commands"), MyStringId.NullOrEmpty); new StringBuilderSync <AutopilotTerminal>(autopilotCommands, (autopilot) => autopilot.value_autopilotCommands, (autopilot, value) => { autopilot.value_autopilotCommands = value; AutopilotCommands.GetOrCreate(autopilot.m_block)?.OnCommandsChanged(); }); AddControl(autopilotCommands); MyTerminalControlButton <MyShipController> gooeyProgram = new MyTerminalControlButton <MyShipController>("ArmsAp_GuiProgram", MyStringId.GetOrCompute("Program Autopilot"), MyStringId.GetOrCompute("Interactive programming for autopilot"), GooeyProgram); gooeyProgram.Enabled = ShipAutopilot.IsAutopilotBlock; AddControl(gooeyProgram); AddPropertyAndSync <ShipAutopilot.State, Enum>("ArmsAp_Status", out autopilotStatus, "value_autopilotStatus"); FieldInfo value_autopilotFlags = typeof(AutopilotTerminal).GetField("value_autopilotFlags", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); autopilotFlags = new ValueSync <AutopilotFlags, AutopilotTerminal>("ArmsAp_AutopilotFlags", GenerateGetter <AutopilotFlags>(value_autopilotFlags), GenerateSetter <AutopilotFlags>(value_autopilotFlags), false); foreach (AutopilotFlags flag in Enum.GetValues(typeof(AutopilotFlags))) { if (flag != 0) { AddPropertyAndSync(flag); } } AddPropertyAndSync <Pathfinder.State, Enum>("ArmsAp_PathStatus", out pathfinderState, "value_pathfinderState"); AddPropertyAndSync <GridFinder.ReasonCannotTarget, Enum>("ArmsAp_ReasonCannotTarget", out reasonCannotTarget, "value_reasonCannotTarget"); AddPropertyAndSync <InfoString.StringId, Enum>("ArmsAp_Complaint", out complaint, "value_complaint"); AddPropertyAndSync <InfoString.StringId_Jump, Enum>("ArmsAp_JumpComplaint", out jumpComplaint, "value_jumpComplaint"); AddPropertyAndSync("ArmsAp_WaitUntil", out waitUntil, "value_waitUntil"); AddPropertyAndSyncEntityId("ArmsAp_BlockedBy", out blockedBy, "value_blockedBy"); FieldInfo value_distance = typeof(AutopilotTerminal).GetField("value_distance", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); distance = new ValueSync <long, AutopilotTerminal>("ArmsAp_Distance", GenerateGetter <long>(value_distance), GenerateSetter <long>(value_distance), false); MyTerminalControlProperty <MyShipController, float> linearDistance = new MyTerminalControlProperty <MyShipController, float>("ArmsAp_LinearDistance") { Getter = GetLinearDistance }; AddControl(linearDistance, false); MyTerminalControlProperty <MyShipController, float> angularDistance = new MyTerminalControlProperty <MyShipController, float>("ArmsAp_AngularDistance") { Getter = GetAngularDistance }; AddControl(angularDistance, false); AddPropertyAndSyncEntityId("ArmsAp_EnemyFinderBestTarget", out enemyFinderBestTarget, "value_enemyFinderBestTarget"); AddPropertyAndSync("ArmsAp_WelderUnfinishedBlocks", out welderUnfinishedBlocks, "value_welderUnfinishedBlocks"); AddPropertyAndSync("ArmsAp_NavigatorMover", out prevNavMover, "value_prevNavMover"); AddPropertyAndSync("ArmsAp_NavigatorRotator", out prevNavRotator, "value_prevNavRotator"); AddPropertyAndSync("ArmsAp_NavigatorMoverInfo", out prevNavMoverInfo, "value_prevNavMoverInfo"); AddPropertyAndSync("ArmsAp_NavigatorRotatorInfo", out prevNavRotatorInfo, "value_prevNavRotatorInfo"); }