Beispiel #1
0
        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);
        }
Beispiel #2
0
            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);
            }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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;
                }
            }
        }
Beispiel #5
0
            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();
                });
            }
Beispiel #6
0
            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");
            }