Exemple #1
0
        void CreateCustomTerminalControls()
        {
            if (_terminalControlsInit)
            {
                return;
            }

            _terminalControlsInit = true;

            IMyTerminalControlOnOffSwitch rechargeControl = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlOnOffSwitch, IMyLargeGatlingTurret>("RechargeRailgun");

            rechargeControl.Title   = MyStringId.GetOrCompute("Recharge Railgun");
            rechargeControl.Enabled = x => x.BlockDefinition.SubtypeId.Equals("LargeRailgunTurretLZM");
            rechargeControl.Visible = x => x.BlockDefinition.SubtypeId.Equals("LargeRailgunTurretLZM");
            rechargeControl.SupportsMultipleBlocks = true;
            rechargeControl.OnText  = MyStringId.GetOrCompute("On");
            rechargeControl.OffText = MyStringId.GetOrCompute("Off");
            rechargeControl.Setter  = (x, v) => SetRecharging(x, v);
            rechargeControl.Getter  = x => GetRecharging(x);
            MyAPIGateway.TerminalControls.AddControl <IMyLargeGatlingTurret>(rechargeControl);

            //Recharge toggle action
            IMyTerminalAction rechargeOnOff = MyAPIGateway.TerminalControls.CreateAction <IMyLargeGatlingTurret>("Recharge_OnOff");

            rechargeOnOff.Action = (x) =>
            {
                var recharge = GetRecharging(x);
                SetRecharging(x, !recharge);
            };
            rechargeOnOff.ValidForGroups = true;
            rechargeOnOff.Writer         = (x, s) => GetWriter(x, s);
            rechargeOnOff.Icon           = @"Textures\GUI\Icons\Actions\Toggle.dds";
            rechargeOnOff.Enabled        = x => x.BlockDefinition.SubtypeId.Equals("LargeRailgunTurretLZM");
            rechargeOnOff.Name           = new StringBuilder("Recharge On/Off");
            MyAPIGateway.TerminalControls.AddAction <IMyLargeGatlingTurret>(rechargeOnOff);

            //Recharge on action
            IMyTerminalAction rechargeOn = MyAPIGateway.TerminalControls.CreateAction <IMyLargeGatlingTurret>("Recharge_On");

            rechargeOn.Action         = (x) => SetRecharging(x, true);
            rechargeOn.ValidForGroups = true;
            rechargeOn.Writer         = (x, s) => GetWriter(x, s);
            rechargeOn.Icon           = @"Textures\GUI\Icons\Actions\SwitchOn.dds";
            rechargeOn.Enabled        = x => x.BlockDefinition.SubtypeId.Equals("LargeRailgunTurretLZM");
            rechargeOn.Name           = new StringBuilder("Recharge On");
            MyAPIGateway.TerminalControls.AddAction <IMyLargeGatlingTurret>(rechargeOn);

            //Recharge off action
            IMyTerminalAction rechargeOff = MyAPIGateway.TerminalControls.CreateAction <IMyLargeGatlingTurret>("Recharge_Off");

            rechargeOff.Action         = (x) => SetRecharging(x, false);
            rechargeOff.ValidForGroups = true;
            rechargeOff.Writer         = (x, s) => GetWriter(x, s);
            rechargeOff.Icon           = @"Textures\GUI\Icons\Actions\SwitchOff.dds";
            rechargeOff.Enabled        = x => x.BlockDefinition.SubtypeId.Equals("LargeRailgunTurretLZM");
            rechargeOff.Name           = new StringBuilder("Recharge Off");
            MyAPIGateway.TerminalControls.AddAction <IMyLargeGatlingTurret>(rechargeOff);
        }
        public IMyTerminalAction DetonateAction()
        {
            IMyTerminalAction button = MyAPIGateway.TerminalControls.CreateAction <IMyConveyorSorter>("Detonate");

            button.Enabled        = HasBlockLogic;
            button.ValidForGroups = true;
            button.Action         = block => BlockAction(block, kernel => kernel.PyroboltModule.TryDetonate());
            button.Name           = new System.Text.StringBuilder("Detonate");
            return(button);
        }
Exemple #3
0
        private static IMyTerminalAction ActionIdExists(string id)
        {
            List <IMyTerminalAction> actions = new List <IMyTerminalAction>();

            MyAPIGateway.TerminalControls.GetActions <IMyUpgradeModule>(out actions);

            IMyTerminalAction action = actions.Find(x => x.Id == id);

            return(action);
        }
        private static void AddAction <T>(IMyTerminalControlButton btn, string icon, Func <IMyTerminalBlock, bool> enabled) where T : IMyTerminalBlock
        {
            IMyTerminalAction a = MyAPIGateway.TerminalControls.CreateAction <T>(btn.Id);

            a.Action         = btn.Action;
            a.Enabled        = enabled;
            a.ValidForGroups = btn.SupportsMultipleBlocks;
            a.Name           = new StringBuilder(btn.Title.String);
            a.Icon           = icon;
            MyAPIGateway.TerminalControls.AddAction <T>(a);
        }
        public void register()
        {
            button = MyAPIGateway.TerminalControls.CreateControl <B, T>(id);

            hotbar      = MyAPIGateway.TerminalControls.CreateAction <T>(id);
            hotbar.Name = new StringBuilder().Append(displayName);

            populate();

            MyAPIGateway.TerminalControls.AddAction <T>(hotbar);
            MyAPIGateway.TerminalControls.AddControl <T>(button);
        }
Exemple #6
0
        private IMyTerminalAction CreativeChargeAction()
        {
            IMyTerminalAction action = MyAPIGateway.TerminalControls.CreateAction <IMyJumpDrive>("LaserJumpRechargeAction");

            action.Enabled = Block => HasBlockLogic(Block) && OwnerHasCreativeRights(Block);
            action.Name    = new System.Text.StringBuilder("Creative Recharge");
            action.Icon    = EemRdx.Helpers.ActionIcons.SwitchOn;
            action.Action  = Block =>
            {
                IMyJumpDrive jumpDrive = Block as IMyJumpDrive;
                jumpDrive.CurrentStoredPower = jumpDrive.MaxStoredPower;
            };
            return(action);
        }
 private void RemoveVanillaSpawnAction(IMyTerminalBlock block, List <IMyTerminalAction> actions)
 {
     if (block is IMyProjector && block.GameLogic.GetAs <InstantProjector>() != null)
     {
         for (int i = actions.Count - 1; i >= 0; i--)
         {
             IMyTerminalAction a = actions[i];
             if (a.Id == "SpawnProjection")
             {
                 actions.RemoveAt(i);
                 return;
             }
         }
     }
 }
 private void RemoveVanillaSpawnAction(IMyTerminalBlock block, List <IMyTerminalAction> actions)
 {
     if (block is IMyProjector && InstantProjector.IsValid(block))
     {
         for (int i = actions.Count - 1; i >= 0; i--)
         {
             IMyTerminalAction a = actions[i];
             if (a.Id == "SpawnProjection")
             {
                 actions.RemoveAt(i);
                 return;
             }
         }
     }
 }
Exemple #9
0
        private void create_slider_action <_block_>(string id, string title, Action <IMyTerminalBlock> action,
                                                    Action <IMyTerminalBlock, StringBuilder> status, string icon) where _block_ : IMyTerminalBlock
        {
            IMyTerminalAction toggle_action = MyAPIGateway.TerminalControls.CreateAction <_block_>(id);

            toggle_action.Action = action;
            if (icon != null && icon != "")
            {
                toggle_action.Icon = @"Textures\GUI\Icons\Actions\" + icon + ".dds";
            }
            toggle_action.Name           = new StringBuilder(title);
            toggle_action.ValidForGroups = true;
            toggle_action.Writer         = status;
            MyAPIGateway.TerminalControls.AddAction <_block_>(toggle_action);
        }
Exemple #10
0
        public static void CreateActionButton(string id, string name, Func <IMyTerminalBlock, bool> enabled, Action <IMyTerminalBlock, StringBuilder> writer, Action <IMyTerminalBlock> action)
        {
            if (ActionIdExists(id) != null)
            {
                return;
            }

            IMyTerminalAction button = MyAPIGateway.TerminalControls.CreateAction <IMyUpgradeModule>(id);

            button.Enabled = enabled;

            button.Name = new StringBuilder(name);

            button.Writer = writer;
            button.Action = action;

            MyAPIGateway.TerminalControls.AddAction <IMyUpgradeModule>(button);
        }
Exemple #11
0
        public void RemoveAction <TBlock>(IMyTerminalAction action)
        {
            if (!IsTypeValid <TBlock>())
            {
                return;
            }

            Type producedType = GetProducedType <TBlock>();

            if (producedType == null)
            {
                return;
            }

            var blockList = MyTerminalControlFactory.GetList(producedType).Actions;

            blockList.Remove((ITerminalAction)action);
        }
Exemple #12
0
        private void create_toggle <_block_>(string id, string title, string enabled_text, string disabled_text, Action <IMyTerminalBlock> action,
                                             Func <IMyTerminalBlock, bool> getter, Func <IMyTerminalBlock, bool> state, string icon) where _block_ : IMyTerminalBlock
        {
            IMyTerminalAction toggle_action = MyAPIGateway.TerminalControls.CreateAction <_block_>(id);

            toggle_action.Action = action;
            if (state != null)
            {
                toggle_action.Enabled = state;
            }
            if (icon != null && icon != "")
            {
                toggle_action.Icon = @"Textures\GUI\Icons\Actions\" + icon + ".dds";
            }
            toggle_action.Name           = new StringBuilder(title);
            toggle_action.ValidForGroups = true;
            toggle_action.Writer         = delegate(IMyTerminalBlock block, StringBuilder output)
            {
                output.Clear();
                output.Append(getter(block) ? enabled_text : disabled_text);
            };
            MyAPIGateway.TerminalControls.AddAction <_block_>(toggle_action);
        }
Exemple #13
0
        private void create_button <_block_>(string id, string title, string tooltip, string action_prefix, Action <IMyTerminalBlock> button_function,
                                             Func <IMyTerminalBlock, bool> state, Action <IMyTerminalBlock, StringBuilder> status) where _block_ : IMyTerminalBlock
        {
            IMyTerminalControlButton new_button    = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, _block_>(id);
            IMyTerminalAction        button_action = MyAPIGateway.TerminalControls.CreateAction <_block_>(id + "Activate");

            new_button.Title   = MyStringId.GetOrCompute(title);
            button_action.Name = new StringBuilder(action_prefix + " " + title);
            if (tooltip != null)
            {
                new_button.Tooltip = MyStringId.GetOrCompute(tooltip);
            }
            new_button.Action = button_action.Action = button_function;
            if (state != null)
            {
                new_button.Enabled = state;
            }
            new_button.SupportsMultipleBlocks = button_action.ValidForGroups = false;
            button_action.Icon   = @"Textures\GUI\Icons\Actions\MissileToggle.dds";
            button_action.Writer = status;
            MyAPIGateway.TerminalControls.AddControl <_block_>(new_button);
            MyAPIGateway.TerminalControls.AddAction <_block_>(button_action);
        }
        public override void UpdateOnceBeforeFrame()
        {
            if (_init)
            {
                return;
            }

            _init  = true;
            _block = Entity as IMyCollector;

            if (_block == null)
            {
                return;
            }

            //create terminal controls
            IMyTerminalControlSeparator sep = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSeparator, IMyCollector>(string.Empty);

            sep.Visible = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner");
            MyAPIGateway.TerminalControls.AddControl <IMyCollector>(sep);

            IMyTerminalControlOnOffSwitch guideSwitch = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlOnOffSwitch, IMyCollector>("Shipyard_GuideSwitch");

            guideSwitch.Title   = MyStringId.GetOrCompute("Guide Boxes");
            guideSwitch.Tooltip = MyStringId.GetOrCompute("Toggles the guide boxes drawn around grids in the shipyard.");
            guideSwitch.OnText  = MyStringId.GetOrCompute("On");
            guideSwitch.OffText = MyStringId.GetOrCompute("Off");
            guideSwitch.Visible = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner");
            guideSwitch.Enabled = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner") && GetYard(b) != null;
            guideSwitch.SupportsMultipleBlocks = true;
            guideSwitch.Getter = GetGuideEnabled;
            guideSwitch.Setter = SetGuideEnabled;
            MyAPIGateway.TerminalControls.AddControl <IMyCollector>(guideSwitch);
            Controls.Add(guideSwitch);

            var lockSwitch = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlOnOffSwitch, IMyCollector>("Shipyard_LockSwitch");

            lockSwitch.Title   = MyStringId.GetOrCompute("Advanced Locking");
            lockSwitch.Tooltip = MyStringId.GetOrCompute("Toggles locking grids in the shipyard when grinding or welding while moving.");
            lockSwitch.OnText  = MyStringId.GetOrCompute("On");
            lockSwitch.OffText = MyStringId.GetOrCompute("Off");
            lockSwitch.Visible = b => b.BlockDefinition.SubtypeId.Equals("ShipyardCorner_Small");
            lockSwitch.Enabled = b => b.BlockDefinition.SubtypeId.Equals("ShipyardCorner_Small") && GetYard(b) != null;
            lockSwitch.SupportsMultipleBlocks = true;
            lockSwitch.Getter = GetLockEnabled;
            lockSwitch.Setter = SetLockEnabled;
            MyAPIGateway.TerminalControls.AddControl <IMyCollector>(lockSwitch);
            Controls.Add(lockSwitch);

            IMyTerminalControlButton grindButton = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, IMyCollector>("Shipyard_GrindButton");
            IMyTerminalControlButton weldButton  = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, IMyCollector>("Shipyard_WeldButton");
            IMyTerminalControlButton stopButton  = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, IMyCollector>("Shipyard_StopButton");

            grindButton.Title   = MyStringId.GetOrCompute("Grind");
            grindButton.Tooltip = MyStringId.GetOrCompute("Begins grinding ships in the yard.");
            grindButton.Enabled = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner") && GetYard(b)?.YardType == ShipyardType.Disabled;
            grindButton.Visible = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner");
            grindButton.SupportsMultipleBlocks = true;
            grindButton.Action = b => Communication.SendYardCommand(b.CubeGrid.EntityId, ShipyardType.Grind);
            MyAPIGateway.TerminalControls.AddControl <IMyCollector>(grindButton);
            Controls.Add(grindButton);

            weldButton.Title   = MyStringId.GetOrCompute("Weld");
            weldButton.Tooltip = MyStringId.GetOrCompute("Begins welding ships in the yard.");
            weldButton.Enabled = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner") && GetYard(b)?.YardType == ShipyardType.Disabled;
            weldButton.Visible = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner");
            weldButton.SupportsMultipleBlocks = true;
            weldButton.Action = b => Communication.SendYardCommand(b.CubeGrid.EntityId, ShipyardType.Weld);
            MyAPIGateway.TerminalControls.AddControl <IMyCollector>(weldButton);
            Controls.Add(weldButton);

            stopButton.Title   = MyStringId.GetOrCompute("Stop");
            stopButton.Tooltip = MyStringId.GetOrCompute("Stops the shipyard.");
            stopButton.Enabled = b =>
            {
                if (!b.BlockDefinition.SubtypeId.Contains("ShipyardCorner"))
                {
                    return(false);
                }

                ShipyardItem yard = GetYard(b);

                return(yard?.YardType == ShipyardType.Weld || yard?.YardType == ShipyardType.Grind);
            };
            stopButton.Visible = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner");
            stopButton.SupportsMultipleBlocks = true;
            stopButton.Action = b => Communication.SendYardCommand(b.CubeGrid.EntityId, ShipyardType.Disabled);
            MyAPIGateway.TerminalControls.AddControl <IMyCollector>(stopButton);
            Controls.Add(stopButton);

            IMyTerminalControlCombobox buildPattern = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlCombobox, IMyCollector>("Shipyard_BuildPattern");

            buildPattern.Title           = MyStringId.GetOrCompute("Build Pattern");
            buildPattern.Tooltip         = MyStringId.GetOrCompute("Pattern used to build projections.");
            buildPattern.ComboBoxContent = FillPatternCombo;
            buildPattern.Visible         = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner");
            buildPattern.Enabled         = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner") && GetYard(b)?.YardType == ShipyardType.Disabled;
            buildPattern.Getter          = GetBuildPattern;
            buildPattern.Setter          = SetBuildPattern;
            MyAPIGateway.TerminalControls.AddControl <IMyCollector>(buildPattern);
            Controls.Add(buildPattern);

            IMyTerminalControlSlider beamCountSlider = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSlider, IMyCollector>("Shipyard_BeamCount");

            beamCountSlider.Title = MyStringId.GetOrCompute("Beam Count");

            beamCountSlider.Tooltip = MyStringId.GetOrCompute("Number of beams this shipyard can use per corner.");
            beamCountSlider.SetLimits(1, 3);
            beamCountSlider.Writer  = (b, result) => result.Append(GetBeamCount(b));
            beamCountSlider.Visible = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner");
            beamCountSlider.Enabled = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner") && GetYard(b) != null;
            beamCountSlider.Getter  = b => GetBeamCount(b);
            beamCountSlider.Setter  = (b, v) =>
            {
                SetBeamCount(b, (int)Math.Round(v, 0, MidpointRounding.ToEven));
                beamCountSlider.UpdateVisual();
            };
            beamCountSlider.SupportsMultipleBlocks = true;
            MyAPIGateway.TerminalControls.AddControl <IMyCollector>(beamCountSlider);
            Controls.Add(beamCountSlider);

            IMyTerminalControlSlider grindSpeedSlider = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSlider, IMyCollector>("Shipyard_GrindSpeed");

            grindSpeedSlider.Title = MyStringId.GetOrCompute("Grind Speed");

            grindSpeedSlider.Tooltip = MyStringId.GetOrCompute("How fast this shipyard grinds grids.");
            grindSpeedSlider.SetLimits(0.01f, 2);
            grindSpeedSlider.Writer  = (b, result) => result.Append(GetGrindSpeed(b));
            grindSpeedSlider.Visible = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner");
            grindSpeedSlider.Enabled = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner") && GetYard(b) != null;
            grindSpeedSlider.Getter  = GetGrindSpeed;
            grindSpeedSlider.Setter  = (b, v) =>
            {
                SetGrindSpeed(b, (float)Math.Round(v, 2, MidpointRounding.ToEven));
                grindSpeedSlider.UpdateVisual();
            };
            grindSpeedSlider.SupportsMultipleBlocks = true;
            MyAPIGateway.TerminalControls.AddControl <IMyCollector>(grindSpeedSlider);
            Controls.Add(grindSpeedSlider);

            IMyTerminalControlSlider weldSpeedSlider = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSlider, IMyCollector>("Shipyard_WeldSpeed");

            weldSpeedSlider.Title = MyStringId.GetOrCompute("Weld Speed");

            weldSpeedSlider.Tooltip = MyStringId.GetOrCompute("How fast this shipyard welds grids.");
            weldSpeedSlider.SetLimits(0.01f, 2);
            weldSpeedSlider.Writer  = (b, result) => result.Append(GetWeldSpeed(b));
            weldSpeedSlider.Visible = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner");
            weldSpeedSlider.Enabled = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner") && GetYard(b) != null;
            weldSpeedSlider.Getter  = GetWeldSpeed;
            weldSpeedSlider.Setter  = (b, v) =>
            {
                SetWeldSpeed(b, (float)Math.Round(v, 2, MidpointRounding.ToEven));
                weldSpeedSlider.UpdateVisual();
            };
            weldSpeedSlider.SupportsMultipleBlocks = true;
            MyAPIGateway.TerminalControls.AddControl <IMyCollector>(weldSpeedSlider);
            Controls.Add(weldSpeedSlider);

            IMyTerminalAction grindAction = MyAPIGateway.TerminalControls.CreateAction <IMyCollector>("Shipyard_GrindAction");

            grindAction.Enabled = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner");
            grindAction.Name    = new StringBuilder("Grind");
            grindAction.Icon    = @"Textures\GUI\Icons\Actions\Start.dds";
            grindAction.Action  = b => Communication.SendYardCommand(b.CubeGrid.EntityId, ShipyardType.Grind);
            MyAPIGateway.TerminalControls.AddAction <IMyCollector>(grindAction);

            IMyTerminalAction weldAction = MyAPIGateway.TerminalControls.CreateAction <IMyCollector>("Shipyard_WeldAction");

            weldAction.Enabled = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner");
            weldAction.Name    = new StringBuilder("Weld");
            weldAction.Icon    = @"Textures\GUI\Icons\Actions\Start.dds";
            weldAction.Action  = b => Communication.SendYardCommand(b.CubeGrid.EntityId, ShipyardType.Weld);
            MyAPIGateway.TerminalControls.AddAction <IMyCollector>(weldAction);

            IMyTerminalAction stopAction = MyAPIGateway.TerminalControls.CreateAction <IMyCollector>("Shipyard_StopAction");

            stopAction.Enabled = b => b.BlockDefinition.SubtypeId.Contains("ShipyardCorner");
            stopAction.Name    = new StringBuilder("Stop");
            stopAction.Icon    = @"Textures\GUI\Icons\Actions\Reset.dds";
            stopAction.Action  = b => Communication.SendYardCommand(b.CubeGrid.EntityId, ShipyardType.Disabled);
            MyAPIGateway.TerminalControls.AddAction <IMyCollector>(stopAction);
        }
        protected override void CreateTerminalControls <T>()
        {
            if (m_ControlsInited.Contains(typeof(T)))
            {
                return;                         // This must be first!
            }
            base.CreateTerminalControls <T>();  // This must be second!

            // Do rest of init
            // Create controls first, so they can be referenced below
            var distance                 = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSlider, T>("JumpDistance"); // Use for compatibility with stock drive
            var selectedTarget           = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlListbox, T>("Phoenix.FTL.SelectedTarget");
            var remButton                = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, T>("Phoenix.FTL.RemoveBtn");
            var addButton                = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, T>("Phoenix.FTL.SelectBtn");
            var gpsList                  = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlListbox, T>("Phoenix.FTL.GpsList");
            var jumpButton               = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, T>("Phoenix.FTL.Jump");
            IMyTerminalAction jumpAction = MyAPIGateway.TerminalControls.CreateAction <IMyTerminalBlock>("Jump");        // Use for compatibility with stock drive

            jumpButton.Title   = MyStringId.GetOrCompute("BlockActionTitle_Jump");
            jumpButton.Visible = (b) => b.IsFTL();
            jumpButton.Enabled = (b) => b.IsWorking;
            jumpButton.Action  = (b) => b.GameLogic.GetAs <FTLBase>().RequestJump();
            MyAPIGateway.TerminalControls.AddControl <T>(jumpButton);

            Action updateDelegate = () =>
            {
                distance.UpdateVisual();
                addButton.UpdateVisual();
                remButton.UpdateVisual();
                selectedTarget.UpdateVisual();
            };

            StringBuilder actionname = new StringBuilder();

            actionname.Append("Jump");
            jumpAction.Name           = actionname;
            jumpAction.Icon           = @"Textures\GUI\Icons\Actions\Toggle.dds";
            jumpAction.ValidForGroups = false;
            jumpAction.Enabled        = (b) => b.IsWorking;
            jumpAction.Action         = (b) => jumpButton.Action(b);
            MyAPIGateway.TerminalControls.AddAction <T>(jumpAction);

            distance.Title = MyStringId.GetOrCompute("BlockPropertyTitle_JumpDistance");
            distance.SetLimits(0f, 100f);
            distance.Getter = (b) => (b.GameLogic.GetAs <FTLBase>().Data.jumpDistance / b.GameLogic.GetAs <FTLGyro>().ComputeMaxDistance()) * 100f;
            distance.Setter = (b, v) => b.GameLogic.GetAs <FTLGyro>().SendDistanceChange((v / 100f) * b.GameLogic.GetAs <FTLGyro>().ComputeMaxDistance());
            distance.Writer = (b, v) =>
            {
                v.AppendFormat("{0:P0} (", distance.Getter(b) / 100f);
                MyValueFormatter.AppendDistanceInBestUnit(b.GameLogic.GetAs <FTLBase>().Data.jumpDistance, v);
                v.Append(")");
            };
            distance.Visible = (b) => b.IsFTL();
            distance.Enabled = (b) => b.GameLogic.GetAs <FTLBase>().Data.jumpTargetGPS == null;
            MyAPIGateway.TerminalControls.AddControl <IMyGyro>(distance);

            selectedTarget.Title            = MyStringId.GetOrCompute("BlockPropertyTitle_DestinationGPS");
            selectedTarget.ListContent      = (b, list1, list2) => b.GameLogic.GetAs <FTLGyro>().FillSelectedTarget(b, list1, list2);
            selectedTarget.Visible          = (b) => b.IsFTL();
            selectedTarget.VisibleRowsCount = 1;
            MyAPIGateway.TerminalControls.AddControl <IMyGyro>(selectedTarget);

            remButton.Title   = MyStringId.GetOrCompute("RemoveProjectionButton");
            remButton.Visible = (b) => b.IsFTL();
            remButton.Enabled = (b) => b.GameLogic.GetAs <FTLGyro>().CanRemove();
            remButton.Action  = (b) =>
            {
                b.GameLogic.GetAs <FTLGyro>().RemoveSelected();
                updateDelegate();
            };
            MyAPIGateway.TerminalControls.AddControl <IMyGyro>(remButton);

            addButton.Title   = MyStringId.GetOrCompute("SelectBlueprint");
            addButton.Visible = (b) => b.IsFTL();
            addButton.Enabled = (b) => b.GameLogic.GetAs <FTLGyro>().CanSelect();
            addButton.Action  = (b) =>
            {
                b.GameLogic.GetAs <FTLGyro>().SelectTarget();
                updateDelegate();
            };
            MyAPIGateway.TerminalControls.AddControl <IMyGyro>(addButton);

            gpsList.Title        = MyStringId.GetOrCompute("BlockPropertyTitle_GpsLocations");
            gpsList.ListContent  = (b, list1, list2) => b.GameLogic.GetAs <FTLGyro>().FillGpsList(b, list1, list2);
            gpsList.ItemSelected = (b, v) =>
            {
                b.GameLogic.GetAs <FTLGyro>().SelectGps(v);
                updateDelegate();
            };
            gpsList.Visible          = (b) => b.IsFTL();
            gpsList.VisibleRowsCount = 8;
            MyAPIGateway.TerminalControls.AddControl <IMyGyro>(gpsList);
        }
Exemple #16
0
        private void InitControls()
        {
            ThrusterOverclock         = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSlider, IMyThrust>("Overclock");
            ThrusterOverclock.Title   = MyStringId.GetOrCompute("Overclock");
            ThrusterOverclock.Tooltip = MyStringId.GetOrCompute("Multiplies thruster power at the cost of heat and degradation.");
            ThrusterOverclock.SetLimits(1, maxThrusterOverclock);
            ThrusterOverclock.SupportsMultipleBlocks = true;
            ThrusterOverclock.Getter = (x) =>
            {
                if (x == null || x.GameLogic == null)
                {
                    return(1f);
                }

                var logic = x.GameLogic.GetAs <ThrustOverride>();

                return(logic != null ? logic.Overclock : 1f);
            };

            ThrusterOverclock.Setter = (x, y) =>
            {
                var logic = x.GameLogic.GetAs <ThrustOverride>();

                if (logic != null)
                {
                    logic.Overclock = y;

                    if (Sync.IsClient)
                    {
                        var message = new MessageThrusterVariables();
                        message.EntityId         = logic.Entity.EntityId;
                        message.UpdateCustomData = true;
                        message.Overclock        = logic.Overclock;
                        message.SafetySwitch     = logic.SafetySwitch;
                        Messaging.SendMessageToServer(message);
                    }
                }
            };

            ThrusterOverclock.Writer = (x, y) =>
            {
                if (x == null || x.GameLogic == null)
                {
                    return;
                }

                var logic = x.GameLogic.GetAs <ThrustOverride>();

                if (logic != null)
                {
                    y.Append(logic.Overclock.ToString() + "x");
                }
            };

            SafetySwitch         = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlOnOffSwitch, IMyThrust>("SafetySwitch");
            SafetySwitch.Title   = MyStringId.GetOrCompute("Safety Switch");
            SafetySwitch.Tooltip = MyStringId.GetOrCompute("When enabled, reduces thrust when necessary to prevent damage from excessive heat.\nTurning this off can allow steady thrust over longer periods of time,\nwhich can be useful in emergencies.");
            SafetySwitch.OnText  = MyStringId.GetOrCompute("On");
            SafetySwitch.OffText = MyStringId.GetOrCompute("Off");
            SafetySwitch.SupportsMultipleBlocks = true;

            SafetySwitch.Getter = x =>
            {
                if (x == null || x.GameLogic == null)
                {
                    return(true);
                }

                var logic = x.GameLogic.GetAs <ThrustOverride>();

                return(logic != null ? logic.SafetySwitch : true);
            };

            SafetySwitch.Setter = (x, y) =>
            {
                Debug.Write("Attempting to set safety switch", 1);
                if (x == null || x.GameLogic == null)
                {
                    return;
                }

                var logic = x.GameLogic.GetAs <ThrustOverride>();

                logic.SafetySwitch = y;

                if (Sync.IsClient)
                {
                    Debug.Write("Set safety switch on client", 1);
                }

                if (Sync.IsServer)
                {
                    Debug.Write("Set safety switch on server", 1);
                }

                if (Sync.IsClient)
                {
                    var message = new MessageThrusterVariables();
                    message.UpdateCustomData = true;
                    message.EntityId         = logic.Entity.EntityId;
                    message.Overclock        = logic.Overclock;
                    message.SafetySwitch     = logic.SafetySwitch;
                    Messaging.SendMessageToServer(message);
                }
            };

            safetySwitchAction         = MyAPIGateway.TerminalControls.CreateAction <IMyThrust>("SafetySwitchAction");
            safetySwitchAction.Enabled = (x) => true;
            safetySwitchAction.Name    = new StringBuilder(string.Format("Safety Toggle On/Off"));
            safetySwitchAction.Icon    = @"Textures\GUI\Icons\Actions\Toggle.dds";
            safetySwitchAction.Action  = (x) =>
            {
                if (x == null || SafetySwitch == null)
                {
                    return;
                }

                SafetySwitch.Setter(x, !SafetySwitch.Getter(x));
            };
            safetySwitchAction.ValidForGroups = true;
            safetySwitchAction.Writer         = (x, y) =>
            {
                if (x == null || SafetySwitch == null)
                {
                    return;
                }

                y.Append(SafetySwitch.Getter(x) ? "On" : "Off");
            };
            safetySwitchAction.InvalidToolbarTypes = new List <MyToolbarType>();

            overclockActionIncrease                = MyAPIGateway.TerminalControls.CreateAction <IMyThrust>("OverclockActionIncrease");
            overclockActionIncrease.Enabled        = (x) => true;
            overclockActionIncrease.Name           = new StringBuilder(string.Format("Increase Overclock"));
            overclockActionIncrease.Icon           = @"Textures\GUI\Icons\Actions\Increase.dds";
            overclockActionIncrease.ValidForGroups = true;
            overclockActionIncrease.Action         = (x) =>
            {
                if (x == null || ThrusterOverclock == null)
                {
                    return;
                }

                ThrusterOverclock.Setter(x, Math.Min(ThrusterOverclock.Getter(x) + 1f, maxThrusterOverclock));
            };
            overclockActionIncrease.Writer = (x, y) =>
            {
                if (x == null || ThrusterOverclock == null)
                {
                    return;
                }
                y.Append(ThrusterOverclock.Getter(x).ToString() + "x");
            };
            overclockActionIncrease.InvalidToolbarTypes = new List <MyToolbarType>();

            overclockActionDecrease                = MyAPIGateway.TerminalControls.CreateAction <IMyThrust>("OverclockActionDecrease");
            overclockActionDecrease.Enabled        = (x) => true;
            overclockActionDecrease.Name           = new StringBuilder(string.Format("Decrease Overclock"));
            overclockActionDecrease.Icon           = @"Textures\GUI\Icons\Actions\Decrease.dds";
            overclockActionDecrease.ValidForGroups = true;
            overclockActionDecrease.Action         = (x) =>
            {
                if (x == null || ThrusterOverclock == null)
                {
                    return;
                }

                ThrusterOverclock.Setter(x, Math.Max(ThrusterOverclock.Getter(x) - 1f, 1f));
            };
            overclockActionDecrease.Writer = (x, y) =>
            {
                if (x == null || ThrusterOverclock == null)
                {
                    return;
                }
                y.Append(ThrusterOverclock.Getter(x).ToString() + "x");
            };
            overclockActionDecrease.InvalidToolbarTypes = new List <MyToolbarType>();
        }
        // Context: All
        public override void UpdateOnceBeforeFrame()
        {
            if (me.CubeGrid?.Physics == null)
            {
                return;
            }

            _state = new SyncableProjectorState(me, State.Idle, 0);

            if (Constants.IsServer)
            {
                LoadStorage();
                _settings.OnValueReceived += SaveStorage;
                BuildState           = State.Idle;
                me.IsWorkingChanged += Me_IsWorkingChanged;
            }
            else
            {
                _settings = new SyncableProjectorSettings(me, 0, true);
                _state.RequestFromServer();
                _settings.RequestFromServer();
                _state.OnValueReceived += ReceivedNewState;
            }

            MyProjectorDefinition def = (MyProjectorDefinition)MyDefinitionManager.Static.GetCubeBlockDefinition(me.BlockDefinition);

            minPower = def.RequiredPowerInput;
            sink     = me.Components.Get <MyResourceSinkComponent>();
            MyDefinitionId powerDef = MyResourceDistributorComponent.ElectricityId;

            sink.SetRequiredInputFuncByType(powerDef, GetCurrentPower);
            sink.Update();
            _settings.OnValueReceived += RefreshUI;

            me.AppendingCustomInfo += CustomInfo;
            me.RefreshCustomInfo();

            Settings.MapSettings config = IPSession.Instance.MapSettings;
            config.OnSubgridsChanged += ClearCachedComps;
            config.OnComponentCostModifierChanged += ClearCachedComps;
            config.OnExtraComponentChanged        += ClearCachedComps;
            config.OnExtraCompCostChanged         += ClearCachedComps;

            if (!controls)
            {
                // Terminal controls

                IMyTerminalControlSeparator sep = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSeparator, IMyProjector>("BuildGridSep");
                sep.Enabled = IsValid;
                sep.Visible = IsValid;
                MyAPIGateway.TerminalControls.AddControl <IMyProjector>(sep);

                IMyTerminalControlButton btnBuild = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, IMyProjector>("BuildGrid");
                btnBuild.Enabled = IsWorking;
                btnBuild.Visible = IsValid;
                btnBuild.SupportsMultipleBlocks = true;
                btnBuild.Title   = MyStringId.GetOrCompute("Build Grid");
                btnBuild.Action  = BuildClient;
                btnBuild.Tooltip = MyStringId.GetOrCompute("Builds the projection instantly.\nThere will be a cooldown after building.");
                MyAPIGateway.TerminalControls.AddControl <IMyProjector>(btnBuild);

                IMyTerminalControlButton btnCancel = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, IMyProjector>("CancelBuildGrid");
                btnCancel.Enabled = IsWorking;
                btnCancel.Visible = IsValid;
                btnCancel.SupportsMultipleBlocks = true;
                btnCancel.Title   = MyStringId.GetOrCompute("Cancel");
                btnCancel.Action  = CancelClient;
                btnCancel.Tooltip = MyStringId.GetOrCompute("Cancels the build process.");
                MyAPIGateway.TerminalControls.AddControl <IMyProjector>(btnCancel);

                IMyTerminalControlCheckbox chkShift = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlCheckbox, IMyProjector>("MoveProjectionArea");
                chkShift.Enabled = IsWorking;
                chkShift.Visible = IsValid;
                chkShift.SupportsMultipleBlocks = true;
                chkShift.Title   = MyStringId.GetOrCompute("Loose Projection Area");
                chkShift.OnText  = MyStringId.GetOrCompute("On");
                chkShift.OffText = MyStringId.GetOrCompute("Off");
                chkShift.Tooltip = MyStringId.GetOrCompute("Allow the projection to spawn in a different area if the original area is occupied.");
                chkShift.Setter  = SetLooseArea;
                chkShift.Getter  = GetLooseArea;
                MyAPIGateway.TerminalControls.AddControl <IMyProjector>(chkShift);

                IMyTerminalControlSlider sliderSpeed = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSlider, IMyProjector>("BuildSpeed");
                sliderSpeed.Enabled = IsWorking;
                sliderSpeed.Visible = IsValid;
                sliderSpeed.SupportsMultipleBlocks = true;
                sliderSpeed.Title   = MyStringId.GetOrCompute("Speed");
                sliderSpeed.Tooltip = MyStringId.GetOrCompute("Increasing the speed will use more energy.");
                sliderSpeed.SetLogLimits(Constants.minSpeed, Constants.maxSpeed);
                sliderSpeed.Writer = GetSpeedText;
                sliderSpeed.Getter = GetSpeed;
                sliderSpeed.Setter = SetSpeed;
                MyAPIGateway.TerminalControls.AddControl <IMyProjector>(sliderSpeed);

                IMyTerminalControlTextbox txtTimeout = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlTextbox, IMyProjector>("GridTimer");
                txtTimeout.Enabled = (b) => false;
                txtTimeout.Visible = IsValid;
                txtTimeout.Getter  = GetTimer;
                txtTimeout.Setter  = (b, s) => { };
                txtTimeout.SupportsMultipleBlocks = false;
                txtTimeout.Title   = MyStringId.GetOrCompute("Build Timer");
                txtTimeout.Tooltip = MyStringId.GetOrCompute("The amount of time you must wait after building a grid to be able to build another.");
                MyAPIGateway.TerminalControls.AddControl <IMyProjector>(txtTimeout);

                // Terminal actions
                // Button panels are special and trigger on the server instead of the client, making everything more complicated.

                IMyTerminalAction aCancel = MyAPIGateway.TerminalControls.CreateAction <IMyProjector>("CancelBuildAction");
                aCancel.Enabled             = IsValid;
                aCancel.Action              = CancelClient; // For all except button panels
                aCancel.ValidForGroups      = true;
                aCancel.Name                = new StringBuilder("Cancel Spawn Grid");
                aCancel.Writer              = (b, s) => s.Append("Cancel");
                aCancel.InvalidToolbarTypes = new[] { MyToolbarType.ButtonPanel }.ToList();
                MyAPIGateway.TerminalControls.AddAction <IMyProjector>(aCancel);
                IMyTerminalAction aCancel2 = MyAPIGateway.TerminalControls.CreateAction <IMyProjector>("CancelBuildGrid");
                aCancel2.Enabled             = IsValid;
                aCancel2.Action              = CancelClientUnsafe; // For only button panels
                aCancel2.ValidForGroups      = true;
                aCancel2.Name                = new StringBuilder("Cancel Spawn Grid");
                aCancel2.Writer              = (b, s) => s.Append("Cancel");
                aCancel2.InvalidToolbarTypes = new List <MyToolbarType> {
                    MyToolbarType.BuildCockpit, MyToolbarType.Character, MyToolbarType.LargeCockpit,
                    MyToolbarType.None, MyToolbarType.Seat, MyToolbarType.Ship, MyToolbarType.SmallCockpit, MyToolbarType.Spectator
                };
                MyAPIGateway.TerminalControls.AddAction <IMyProjector>(aCancel2);

                IMyTerminalAction aBuild = MyAPIGateway.TerminalControls.CreateAction <IMyProjector>("BuildGridAction");
                aBuild.Enabled             = IsValid;
                aBuild.Action              = BuildClient; // For all except button panels
                aBuild.ValidForGroups      = true;
                aBuild.Name                = new StringBuilder("Spawn Grid");
                aBuild.Writer              = (b, s) => s.Append("Spawn");
                aBuild.InvalidToolbarTypes = new [] { MyToolbarType.ButtonPanel }.ToList();
                MyAPIGateway.TerminalControls.AddAction <IMyProjector>(aBuild);
                IMyTerminalAction aBuild2 = MyAPIGateway.TerminalControls.CreateAction <IMyProjector>("BuildGrid");
                aBuild2.Enabled             = IsValid;
                aBuild2.Action              = BuildClientUnsafe; // For only button panels
                aBuild2.ValidForGroups      = true;
                aBuild2.Name                = new StringBuilder("Spawn Grid");
                aBuild2.Writer              = (b, s) => s.Append("Spawn");
                aBuild2.InvalidToolbarTypes = new List <MyToolbarType> {
                    MyToolbarType.BuildCockpit, MyToolbarType.Character, MyToolbarType.LargeCockpit,
                    MyToolbarType.None, MyToolbarType.Seat, MyToolbarType.Ship, MyToolbarType.SmallCockpit, MyToolbarType.Spectator
                };
                MyAPIGateway.TerminalControls.AddAction <IMyProjector>(aBuild2);

                IMyTerminalControlListbox itemList = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlListbox, IMyProjector>("ComponentList");
                itemList.Enabled                = IsWorking;
                itemList.Visible                = IsValid;
                itemList.ListContent            = GetItemList;
                itemList.Multiselect            = false;
                itemList.SupportsMultipleBlocks = false;
                itemList.Title            = MyStringId.GetOrCompute("Components");
                itemList.VisibleRowsCount = 10;
                itemList.ItemSelected     = (b, l) => { };
                MyAPIGateway.TerminalControls.AddControl <IMyProjector>(itemList);


                // Programmable Block stuff

                IMyTerminalControlProperty <Dictionary <MyItemType, int> > itemListProp
                    = MyAPIGateway.TerminalControls.CreateProperty <Dictionary <MyItemType, int>, IMyProjector>("RequiredComponents");
                itemListProp.Enabled = IsWorking;
                itemListProp.Visible = IsValid;
                itemListProp.SupportsMultipleBlocks = false;
                itemListProp.Setter = (b, l) => { };
                itemListProp.Getter = GetItemListPB;
                MyAPIGateway.TerminalControls.AddControl <IMyProjector>(itemListProp);

                IMyTerminalControlProperty <int> gridTimeoutProp
                    = MyAPIGateway.TerminalControls.CreateProperty <int, IMyProjector>("GridTimerProjection");
                gridTimeoutProp.Enabled = IsWorking;
                gridTimeoutProp.Visible = IsValid;
                gridTimeoutProp.SupportsMultipleBlocks = false;
                gridTimeoutProp.Setter = (b, l) => { };
                gridTimeoutProp.Getter = GetMaxTimerPB;
                MyAPIGateway.TerminalControls.AddControl <IMyProjector>(gridTimeoutProp);

                IMyTerminalControlProperty <int> gridTimeoutActive
                    = MyAPIGateway.TerminalControls.CreateProperty <int, IMyProjector>("GridTimerCurrent");
                gridTimeoutActive.Enabled = IsWorking;
                gridTimeoutActive.Visible = IsValid;
                gridTimeoutActive.SupportsMultipleBlocks = false;
                gridTimeoutActive.Setter = (b, l) => { };
                gridTimeoutActive.Getter = GetCurrentTimerPB;
                MyAPIGateway.TerminalControls.AddControl <IMyProjector>(gridTimeoutActive);

                IMyTerminalControlProperty <int> buildState
                    = MyAPIGateway.TerminalControls.CreateProperty <int, IMyProjector>("BuildState");
                buildState.Enabled = IsWorking;
                buildState.Visible = IsValid;
                buildState.SupportsMultipleBlocks = false;
                buildState.Setter = (b, l) => { };
                buildState.Getter = GetStatePB;
                MyAPIGateway.TerminalControls.AddControl <IMyProjector>(gridTimeoutActive);

                MyLog.Default.WriteLineAndConsole("Initialized Instant Projector.");
                controls = true;
            }
        }
Exemple #18
0
        private void CreateControls()
        {
            // Actions
            IMyTerminalAction toggleWarp = MyAPIGateway.TerminalControls.CreateAction <IMyUpgradeModule>("ToggleWarp");

            toggleWarp.Enabled = IsWarpDrive;
            toggleWarp.Name    = new StringBuilder("Toggle Warp");
            toggleWarp.Action  = ToggleWarp;
            toggleWarp.Icon    = "Textures\\GUI\\Icons\\Actions\\Toggle.dds";
            toggleWarp.Writer  = GetWarpStatusText;
            MyAPIGateway.TerminalControls.AddAction <IMyUpgradeModule>(toggleWarp);

            IMyTerminalAction toggleSafety = MyAPIGateway.TerminalControls.CreateAction <IMyUpgradeModule>("ToggleSafety");

            toggleSafety.Enabled = IsWarpDrive;
            toggleSafety.Name    = new StringBuilder("Toggle Safety");
            toggleSafety.Action  = ToggleSafety;
            toggleSafety.Icon    = "Textures\\GUI\\Icons\\Actions\\Toggle.dds";
            toggleSafety.Writer  = GetSafetyText;
            MyAPIGateway.TerminalControls.AddAction <IMyUpgradeModule>(toggleSafety);

            // Controls
            IMyTerminalControlButton startWarpBtn = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, IMyUpgradeModule>("StartWarpBtn");

            startWarpBtn.Tooltip = MyStringId.GetOrCompute("Toggles the status of the warp drives on the ship");
            startWarpBtn.Title   = MyStringId.GetOrCompute("Toggle Warp");
            startWarpBtn.Enabled = IsWarpDrive;
            startWarpBtn.Visible = IsWarpDrive;
            startWarpBtn.SupportsMultipleBlocks = false;
            startWarpBtn.Action = ToggleWarp;
            MyAPIGateway.TerminalControls.AddControl <IMyUpgradeModule>(startWarpBtn);

            IMyTerminalControlCheckbox safetyCheckbox = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlCheckbox, IMyUpgradeModule>("Safety");

            safetyCheckbox.Tooltip = MyStringId.GetOrCompute("When checked, the warp drive will not function without a player on the ship.");
            safetyCheckbox.Title   = MyStringId.GetOrCompute("Safety");
            safetyCheckbox.OffText = MyStringId.GetOrCompute("Off");
            safetyCheckbox.OnText  = MyStringId.GetOrCompute("On");
            safetyCheckbox.Enabled = IsWarpDrive;
            safetyCheckbox.Visible = IsWarpDrive;
            safetyCheckbox.SupportsMultipleBlocks = false;
            safetyCheckbox.Setter = SetWarpSafety;
            safetyCheckbox.Getter = GetWarpSafety;
            MyAPIGateway.TerminalControls.AddControl <IMyUpgradeModule>(safetyCheckbox);

            // Pb Properties
            IMyTerminalControlProperty <bool> inWarp = MyAPIGateway.TerminalControls.CreateProperty <bool, IMyUpgradeModule>("WarpStatus");

            inWarp.Enabled = IsWarpDrive;
            inWarp.Visible = IsWarpDrive;
            inWarp.SupportsMultipleBlocks = false;
            inWarp.Setter = SetWarpStatus;
            inWarp.Getter = GetWarpStatus;
            MyAPIGateway.TerminalControls.AddControl <IMyUpgradeModule>(inWarp);

            IMyTerminalControlProperty <bool> warpSafetyProp = MyAPIGateway.TerminalControls.CreateProperty <bool, IMyUpgradeModule>("WarpSafety");

            warpSafetyProp.Enabled = IsWarpDrive;
            warpSafetyProp.Visible = IsWarpDrive;
            warpSafetyProp.SupportsMultipleBlocks = false;
            warpSafetyProp.Setter = SetWarpSafety;
            warpSafetyProp.Getter = GetWarpSafety;
            MyAPIGateway.TerminalControls.AddControl <IMyUpgradeModule>(warpSafetyProp);

            IMyTerminalControlProperty <float> heatPercent = MyAPIGateway.TerminalControls.CreateProperty <float, IMyUpgradeModule>("WarpHeat");

            heatPercent.Enabled = IsWarpDrive;
            heatPercent.Visible = IsWarpDrive;
            heatPercent.SupportsMultipleBlocks = false;
            heatPercent.Setter = (x, y) => { };
            heatPercent.Getter = GetWarpHeat;
            MyAPIGateway.TerminalControls.AddControl <IMyUpgradeModule>(heatPercent);
        }
Exemple #19
0
    public static void InitLate()
    {
        initialized = true;

        nextFrameAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_NextFrame");
        nextFrameAction.Name   = new StringBuilder("Next Frame");
        nextFrameAction.Action = ActionNextFrame;
        nextFrameAction.Writer = FrameNumWriterGen("+1");
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(nextFrameAction);

        prevFrameAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_PrevFrame");
        prevFrameAction.Name   = new StringBuilder("Prev Frame");
        prevFrameAction.Action = ActionPrevFrame;
        prevFrameAction.Writer = FrameNumWriterGen("-1");
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(prevFrameAction);

        nextFrame10Action        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_NextFrame10");
        nextFrame10Action.Name   = new StringBuilder("Next Frame +10");
        nextFrame10Action.Action = ActionNextFrame10;
        nextFrame10Action.Writer = FrameNumWriterGen("+10");
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(nextFrame10Action);

        prevFrame10Action        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_PrevFrame10");
        prevFrame10Action.Name   = new StringBuilder("Prev Frame -10");
        prevFrame10Action.Action = ActionPrevFrame10;
        prevFrame10Action.Writer = FrameNumWriterGen("-10");
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(prevFrame10Action);

        nextKeyFrameAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_NextKeyFrame");
        nextKeyFrameAction.Name   = new StringBuilder("Next Keyframe");
        nextKeyFrameAction.Action = ActionNextKeyFrame;
        nextKeyFrameAction.Writer = FrameNumWriterGen("+K");
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(nextKeyFrameAction);

        prevKeyFrameAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_PrevKeyFrame");
        prevKeyFrameAction.Name   = new StringBuilder("Prev Keyframe");
        prevKeyFrameAction.Action = ActionPrevKeyFrame;
        prevKeyFrameAction.Writer = FrameNumWriterGen("-K");
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(prevKeyFrameAction);

        playAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_Play");
        playAction.Name   = new StringBuilder("Play");
        playAction.Action = ActionPlay;
        playAction.Writer = ConditionToggleWriterGen((cam) => cam.PlaybackState == PlaybackMode.Playing, "Play");
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(playAction);

        pauseAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_Pause");
        pauseAction.Name   = new StringBuilder("Pause");
        pauseAction.Action = ActionPause;
        pauseAction.Writer = ConditionToggleWriterGen((cam) => cam.PlaybackState == PlaybackMode.Paused, "Paus");
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(pauseAction);

        playPauseAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_PlayPause");
        playPauseAction.Name   = new StringBuilder("Play/Pause");
        playPauseAction.Action = ActionPlayPause;
        playPauseAction.Writer = ConditionToggleWriterGen((cam) => cam.PlaybackState == PlaybackMode.Playing, "Play");
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(playPauseAction);

        stopAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_Stop");
        stopAction.Name   = new StringBuilder("Stop");
        stopAction.Action = ActionStop;
        stopAction.Writer = ConditionToggleWriterGen((cam) => cam.PlaybackState == PlaybackMode.Stopped, "Stop");
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(stopAction);

        setFrameAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_SetKey");
        setFrameAction.Name   = new StringBuilder("Set Frame");
        setFrameAction.Action = ActionSetFrame;
        setFrameAction.Writer = (b, sb) => { sb.Clear(); sb.Append("^Frm"); };
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(setFrameAction);

        setPosFrameAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_SetPosKey");
        setPosFrameAction.Name   = new StringBuilder("Set Pos");
        setPosFrameAction.Action = ActionSetPosFrame;
        setPosFrameAction.Writer = (b, sb) => { sb.Clear(); sb.Append("^Pos"); };
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(setPosFrameAction);

        setViewFrameAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_SetViewKey");
        setViewFrameAction.Name   = new StringBuilder("Set View");
        setViewFrameAction.Action = ActionSetViewFrame;
        setViewFrameAction.Writer = (b, sb) => { sb.Clear(); sb.Append("^View"); };
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(setViewFrameAction);

        delKeyframeAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_DelKeyframe");
        delKeyframeAction.Name   = new StringBuilder("Remove Keyframe");
        delKeyframeAction.Action = ActionDelKeyframe;
        delKeyframeAction.Writer = (b, sb) => { sb.Clear(); sb.Append("RmFrm"); };
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(delKeyframeAction);

        toggleKeyframeModeAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_ToggleTransitionMode");
        toggleKeyframeModeAction.Name   = new StringBuilder("Change Transition");
        toggleKeyframeModeAction.Action = ActionToggleKeyframeMode;
        toggleKeyframeModeAction.Writer = KeyframeModeWriter;
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(toggleKeyframeModeAction);

        lockViewAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_LockViewToTarget");
        lockViewAction.Name   = new StringBuilder("Lock View to Target");
        lockViewAction.Action = ActionLockViewToTarget;
        lockViewAction.Writer = ConditionToggleWriterGen((cam) => cam.view_locked_to != null, "VTgt");
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(lockViewAction);

        lockPosAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_LockPosToTarget");
        lockPosAction.Name   = new StringBuilder("Lock Pos to Target");
        lockPosAction.Action = ActionLockPosToTarget;
        lockPosAction.Writer = ConditionToggleWriterGen((cam) => cam.pos_locked_to != null, "PTgt");
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(lockPosAction);

        setFocusAction        = MyAPIGateway.TerminalControls.CreateAction <IMyCameraBlock>("Camera_SetFocusToViewLock");
        setFocusAction.Name   = new StringBuilder("Set Focus to View Lock");
        setFocusAction.Action = ActionSetFocusToViewLock;
        setFocusAction.Writer = (b, sb) => { sb.Clear(); sb.Append("Focus"); };
        MyAPIGateway.TerminalControls.AddAction <IMyCameraBlock>(setFocusAction);

        rangeSlider         = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSlider, IMyCameraBlock>("Camera_FocusDistance");
        rangeSlider.Title   = MyStringId.GetOrCompute("Focus Distance");
        rangeSlider.Tooltip = MyStringId.GetOrCompute("Focus distance. Important when camera is locked to a distant object.");
        rangeSlider.SetLogLimits(1.0f, 100000.0f);
        rangeSlider.SupportsMultipleBlocks = true;
        rangeSlider.Getter  = b => (float)SettingsStore.Get(b, "focus_distance", 1.0f);
        rangeSlider.Setter  = (b, v) => SettingsStore.Set(b, "focus_distance", (float)LogRound(v));
        rangeSlider.Writer  = (b, result) => result.Append(SettingsStore.Get(b, "focus_distance", 1.0f));
        rangeSlider.Visible = BlockIsMyCamera;
        MyAPIGateway.TerminalControls.AddControl <IMyCameraBlock>(rangeSlider);

        MyAPIGateway.TerminalControls.CustomActionGetter += GetCameraActions;
    }
Exemple #20
0
        public static void InitLate()
        {
            initialized = true;

            powerSwitch         = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlOnOffSwitch, IMyTerminalBlock>("HoverRail_OnOff");
            powerSwitch.Title   = MyStringId.GetOrCompute("Maglev Engine");
            powerSwitch.Tooltip = MyStringId.GetOrCompute("Enable to apply force to stick to the track.");
            powerSwitch.Getter  = b => (bool)SettingsStore.Get(b, "power_on", true);
            powerSwitch.Setter  = (b, v) => SettingsStore.Set(b, "power_on", v);
            powerSwitch.SupportsMultipleBlocks = true;
            powerSwitch.OnText  = MyStringId.GetOrCompute("On");
            powerSwitch.OffText = MyStringId.GetOrCompute("Off");
            powerSwitch.Visible = BlockIsEngine;
            MyAPIGateway.TerminalControls.AddControl <IMyTerminalBlock>(powerSwitch);

            forceSlider         = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSlider, IMyTerminalBlock>("HoverRail_ForceLimit");
            forceSlider.Title   = MyStringId.GetOrCompute("Force Limit");
            forceSlider.Tooltip = MyStringId.GetOrCompute("The amount of force applied to align this motor with the track.");
            forceSlider.SetLogLimits(10000.0f, 50000000.0f);
            forceSlider.SupportsMultipleBlocks = true;
            forceSlider.Getter  = b => (float)SettingsStore.Get(b, "force_slider", 100000.0f);
            forceSlider.Setter  = (b, v) => SettingsStore.Set(b, "force_slider", (float)LogRound(v));
            forceSlider.Writer  = (b, result) => result.Append(String.Format("{0}N", SIFormat((float)SettingsStore.Get(b, "force_slider", 100000.0f))));
            forceSlider.Visible = BlockIsEngine;
            MyAPIGateway.TerminalControls.AddControl <IMyTerminalBlock>(forceSlider);

            heightSlider         = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSlider, IMyTerminalBlock>("HoverRail_HeightOffset");
            heightSlider.Title   = MyStringId.GetOrCompute("Height Offset");
            heightSlider.Tooltip = MyStringId.GetOrCompute("The height we float above the track.");
            heightSlider.SetLimits(0.1f, 2.5f);
            heightSlider.SupportsMultipleBlocks = true;
            heightSlider.Getter  = b => (float)SettingsStore.Get(b, "height_offset", 1.25f);
            heightSlider.Setter  = (b, v) => SettingsStore.Set(b, "height_offset", (float)Math.Round(v, 1));
            heightSlider.Writer  = (b, result) => result.Append(String.Format("{0}m", (float)SettingsStore.Get(b, "height_offset", 1.25f)));
            heightSlider.Visible = BlockIsEngine;
            MyAPIGateway.TerminalControls.AddControl <IMyTerminalBlock>(heightSlider);

            lowerHeightAction        = MyAPIGateway.TerminalControls.CreateAction <IMyTerminalBlock>("HoverRailEngine_LowerHeight0.1");
            lowerHeightAction.Name   = new StringBuilder("Lower Height");
            lowerHeightAction.Action = LowerHeightAction;
            lowerHeightAction.Writer = (block, builder) => {
                builder.Clear();
                builder.Append(String.Format("{0} -", (float)SettingsStore.Get(block, "height_offset", 1.25f)));
            };
            MyAPIGateway.TerminalControls.AddAction <IMyTerminalBlock>(lowerHeightAction);

            raiseHeightAction        = MyAPIGateway.TerminalControls.CreateAction <IMyTerminalBlock>("HoverRailEngine_RaiseHeight0.1");
            raiseHeightAction.Name   = new StringBuilder("Raise Height");
            raiseHeightAction.Action = RaiseHeightAction;
            raiseHeightAction.Writer = (block, builder) => {
                builder.Clear();
                builder.Append(String.Format("{0} +", (float)SettingsStore.Get(block, "height_offset", 1.25f)));
            };
            MyAPIGateway.TerminalControls.AddAction <IMyTerminalBlock>(raiseHeightAction);

            turnOnAction        = MyAPIGateway.TerminalControls.CreateAction <IMyTerminalBlock>("HoverRailEngine_On");
            turnOnAction.Name   = new StringBuilder("Power On");
            turnOnAction.Action = TurnOnAction;
            turnOnAction.Writer = OnOffWriter;
            MyAPIGateway.TerminalControls.AddAction <IMyTerminalBlock>(turnOnAction);

            turnOffAction        = MyAPIGateway.TerminalControls.CreateAction <IMyTerminalBlock>("HoverRailEngine_Off");
            turnOffAction.Name   = new StringBuilder("Power Off");
            turnOffAction.Action = TurnOffAction;
            turnOffAction.Writer = OnOffWriter;
            MyAPIGateway.TerminalControls.AddAction <IMyTerminalBlock>(turnOffAction);

            turnOnOffAction        = MyAPIGateway.TerminalControls.CreateAction <IMyTerminalBlock>("HoverRailEngine_OnOff");
            turnOnOffAction.Name   = new StringBuilder("Power On/Off");
            turnOnOffAction.Action = TurnOnOffAction;
            turnOnOffAction.Writer = OnOffWriter;
            MyAPIGateway.TerminalControls.AddAction <IMyTerminalBlock>(turnOnOffAction);

            MyAPIGateway.TerminalControls.CustomActionGetter += GetEngineActions;
        }
        public static void Create()
        {
            if (controls)
            {
                return;
            }

            IMyTerminalControlSeparator sep = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSeparator, IMyProjector>("BuildGridSep");

            sep.Enabled = IsValid;
            sep.Visible = IsValid;
            sep.SupportsMultipleBlocks = true;
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(sep);

            IMyTerminalControlLabel lbl = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlLabel, IMyProjector>("BuildGridLabel");

            lbl.Enabled = IsValid;
            lbl.Visible = IsValid;
            lbl.SupportsMultipleBlocks = true;
            lbl.Label = MyStringId.GetOrCompute("Instant Projector Controls");
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(lbl);

            IMyTerminalControlButton btnBuild = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, IMyProjector>("BuildGrid");

            btnBuild.Enabled = IsWorking;
            btnBuild.Visible = IsValid;
            btnBuild.SupportsMultipleBlocks = true;
            btnBuild.Title   = MyStringId.GetOrCompute("Build Grid");
            btnBuild.Action  = BuildClient;
            btnBuild.Tooltip = MyStringId.GetOrCompute("Builds the projection instantly.\nThere will be a cooldown after building.");
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(btnBuild);

            IMyTerminalControlButton btnCancel = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, IMyProjector>("CancelBuildGrid");

            btnCancel.Enabled = IsWorking;
            btnCancel.Visible = IsValid;
            btnCancel.SupportsMultipleBlocks = true;
            btnCancel.Title   = MyStringId.GetOrCompute("Cancel");
            btnCancel.Action  = CancelClient;
            btnCancel.Tooltip = MyStringId.GetOrCompute("Cancels the build process.");
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(btnCancel);

            IMyTerminalControlCheckbox chkShift = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlCheckbox, IMyProjector>("MoveProjectionArea");

            chkShift.Enabled = IsWorking;
            chkShift.Visible = IsValid;
            chkShift.SupportsMultipleBlocks = true;
            chkShift.Title   = MyStringId.GetOrCompute("Loose Projection Area");
            chkShift.OnText  = MyStringId.GetOrCompute("On");
            chkShift.OffText = MyStringId.GetOrCompute("Off");
            chkShift.Tooltip = MyStringId.GetOrCompute("Allow the projection to spawn in a different area if the original area is occupied.");
            chkShift.Setter  = SetLooseArea;
            chkShift.Getter  = GetLooseArea;
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(chkShift);

            IMyTerminalControlSlider sliderSpeed = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlSlider, IMyProjector>("BuildSpeed");

            sliderSpeed.Enabled = IsWorking;
            sliderSpeed.Visible = IsValid;
            sliderSpeed.SupportsMultipleBlocks = true;
            sliderSpeed.Title   = MyStringId.GetOrCompute("Speed");
            sliderSpeed.Tooltip = MyStringId.GetOrCompute("Increasing the speed will use more energy.");
            sliderSpeed.SetLogLimits(Constants.minSpeed, Constants.maxSpeed);
            sliderSpeed.Writer = GetSpeedText;
            sliderSpeed.Getter = GetSpeed;
            sliderSpeed.Setter = SetSpeed;
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(sliderSpeed);

            IMyTerminalControlTextbox txtTimeout = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlTextbox, IMyProjector>("GridTimer");

            txtTimeout.Enabled = (b) => false;
            txtTimeout.Visible = IsValid;
            txtTimeout.Getter  = GetTimer;
            txtTimeout.Setter  = (b, s) => { };
            txtTimeout.SupportsMultipleBlocks = false;
            txtTimeout.Title   = MyStringId.GetOrCompute("Build Timer");
            txtTimeout.Tooltip = MyStringId.GetOrCompute("The amount of time you must wait after building a grid to be able to build another.");
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(txtTimeout);

            // Terminal actions
            // Button panels are special and trigger on the server instead of the client, making everything more complicated.

            IMyTerminalAction aCancel = MyAPIGateway.TerminalControls.CreateAction <IMyProjector>("CancelBuildAction");

            aCancel.Enabled             = IsValid;
            aCancel.Action              = CancelClient; // For all except button panels
            aCancel.ValidForGroups      = true;
            aCancel.Name                = new StringBuilder("Cancel Spawn Grid");
            aCancel.Writer              = (b, s) => s.Append("Cancel");
            aCancel.InvalidToolbarTypes = new[] { MyToolbarType.ButtonPanel }.ToList();
            MyAPIGateway.TerminalControls.AddAction <IMyProjector>(aCancel);
            IMyTerminalAction aCancel2 = MyAPIGateway.TerminalControls.CreateAction <IMyProjector>("CancelBuildGrid");

            aCancel2.Enabled             = IsValid;
            aCancel2.Action              = CancelClientUnsafe; // For only button panels
            aCancel2.ValidForGroups      = true;
            aCancel2.Name                = new StringBuilder("Cancel Spawn Grid");
            aCancel2.Writer              = (b, s) => s.Append("Cancel");
            aCancel2.InvalidToolbarTypes = new List <MyToolbarType> {
                MyToolbarType.BuildCockpit, MyToolbarType.Character, MyToolbarType.LargeCockpit,
                MyToolbarType.None, MyToolbarType.Seat, MyToolbarType.Ship, MyToolbarType.SmallCockpit, MyToolbarType.Spectator
            };
            MyAPIGateway.TerminalControls.AddAction <IMyProjector>(aCancel2);

            IMyTerminalAction aBuild = MyAPIGateway.TerminalControls.CreateAction <IMyProjector>("BuildGridAction");

            aBuild.Enabled             = IsValid;
            aBuild.Action              = BuildClient; // For all except button panels
            aBuild.ValidForGroups      = true;
            aBuild.Name                = new StringBuilder("Spawn Grid");
            aBuild.Writer              = (b, s) => s.Append("Spawn");
            aBuild.InvalidToolbarTypes = new[] { MyToolbarType.ButtonPanel }.ToList();
            MyAPIGateway.TerminalControls.AddAction <IMyProjector>(aBuild);
            IMyTerminalAction aBuild2 = MyAPIGateway.TerminalControls.CreateAction <IMyProjector>("BuildGrid");

            aBuild2.Enabled             = IsValid;
            aBuild2.Action              = BuildClientUnsafe; // For only button panels
            aBuild2.ValidForGroups      = true;
            aBuild2.Name                = new StringBuilder("Spawn Grid");
            aBuild2.Writer              = (b, s) => s.Append("Spawn");
            aBuild2.InvalidToolbarTypes = new List <MyToolbarType> {
                MyToolbarType.BuildCockpit, MyToolbarType.Character, MyToolbarType.LargeCockpit,
                MyToolbarType.None, MyToolbarType.Seat, MyToolbarType.Ship, MyToolbarType.SmallCockpit, MyToolbarType.Spectator
            };
            MyAPIGateway.TerminalControls.AddAction <IMyProjector>(aBuild2);

            IMyTerminalControlListbox itemList = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlListbox, IMyProjector>("ComponentList");

            itemList.Enabled                = IsWorking;
            itemList.Visible                = IsValid;
            itemList.ListContent            = GetItemList;
            itemList.Multiselect            = false;
            itemList.SupportsMultipleBlocks = false;
            itemList.Title            = MyStringId.GetOrCompute("Components");
            itemList.VisibleRowsCount = 10;
            itemList.ItemSelected     = (b, l) => { };
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(itemList);

            IMyTerminalControlButton itemListInfo = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlButton, IMyProjector>("ComponentListInfo");

            itemListInfo.Enabled = IsWorking;
            itemListInfo.Visible = IsValid;
            itemListInfo.SupportsMultipleBlocks = false;
            itemListInfo.Title  = MyStringId.GetOrCompute("Check Inventory");
            itemListInfo.Action = OpenItemList;
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(itemListInfo);


            // Programmable Block stuff

            IMyTerminalControlProperty <Dictionary <MyItemType, int> > itemListProp
                = MyAPIGateway.TerminalControls.CreateProperty <Dictionary <MyItemType, int>, IMyProjector>("RequiredComponents");

            itemListProp.Enabled = IsWorking;
            itemListProp.Visible = IsValid;
            itemListProp.SupportsMultipleBlocks = false;
            itemListProp.Setter = (b, l) => { };
            itemListProp.Getter = GetItemListPB;
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(itemListProp);

            IMyTerminalControlProperty <int> gridTimeoutProp
                = MyAPIGateway.TerminalControls.CreateProperty <int, IMyProjector>("GridTimerProjection");

            gridTimeoutProp.Enabled = IsWorking;
            gridTimeoutProp.Visible = IsValid;
            gridTimeoutProp.SupportsMultipleBlocks = false;
            gridTimeoutProp.Setter = (b, l) => { };
            gridTimeoutProp.Getter = GetMaxTimerPB;
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(gridTimeoutProp);

            IMyTerminalControlProperty <int> gridTimeoutActive
                = MyAPIGateway.TerminalControls.CreateProperty <int, IMyProjector>("GridTimerCurrent");

            gridTimeoutActive.Enabled = IsWorking;
            gridTimeoutActive.Visible = IsValid;
            gridTimeoutActive.SupportsMultipleBlocks = false;
            gridTimeoutActive.Setter = (b, l) => { };
            gridTimeoutActive.Getter = GetCurrentTimerPB;
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(gridTimeoutActive);

            IMyTerminalControlProperty <int> buildState
                = MyAPIGateway.TerminalControls.CreateProperty <int, IMyProjector>("BuildState");

            buildState.Enabled = IsWorking;
            buildState.Visible = IsValid;
            buildState.SupportsMultipleBlocks = false;
            buildState.Setter = (b, l) => { };
            buildState.Getter = GetStatePB;
            MyAPIGateway.TerminalControls.AddControl <IMyProjector>(gridTimeoutActive);

            MyLog.Default.WriteLineAndConsole("Initialized Instant Projector.");
            controls = true;
        }
        public static void InitLate()
        {
            initialized = true;

            turnLeftSwitch         = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlOnOffSwitch, IMyTerminalBlock>("LeftJunction_TurnOnOff");
            turnLeftSwitch.Title   = MyStringId.GetOrCompute("Junction Direction");
            turnLeftSwitch.Tooltip = MyStringId.GetOrCompute("Which way should a train go?");
            turnLeftSwitch.Getter  = b => (bool)SettingsStore.Get(b, "junction_turn", false);
            turnLeftSwitch.Setter  = (b, v) => SettingsStore.Set(b, "junction_turn", v);
            turnLeftSwitch.OnText  = MyStringId.GetOrCompute("Left");
            turnLeftSwitch.OffText = MyStringId.GetOrCompute("Fwd");
            turnLeftSwitch.Visible = BlockIsLeftJunction;
            MyAPIGateway.TerminalControls.AddControl <IMyTerminalBlock>(turnLeftSwitch);

            turnRightSwitch         = MyAPIGateway.TerminalControls.CreateControl <IMyTerminalControlOnOffSwitch, IMyTerminalBlock>("RightJunction_TurnOnOff");
            turnRightSwitch.Title   = MyStringId.GetOrCompute("Junction Direction");
            turnRightSwitch.Tooltip = MyStringId.GetOrCompute("Which way should a train go?");
            // meaning flipped relative to switch, so that we can
            // swap the labels and have [Fwd] [Right], which is more pleasing
            turnRightSwitch.Getter  = b => !(bool)SettingsStore.Get(b, "junction_turn", false);
            turnRightSwitch.Setter  = (b, v) => SettingsStore.Set(b, "junction_turn", !v);
            turnRightSwitch.OnText  = MyStringId.GetOrCompute("Fwd");
            turnRightSwitch.OffText = MyStringId.GetOrCompute("Right");
            turnRightSwitch.Visible = BlockIsRightJunction;
            MyAPIGateway.TerminalControls.AddControl <IMyTerminalBlock>(turnRightSwitch);

            leftSwitchAction        = MyAPIGateway.TerminalControls.CreateAction <IMyTerminalBlock>("HoverRailLeftJunction_Switch");
            leftSwitchAction.Name   = new StringBuilder("Switch Direction");
            leftSwitchAction.Writer = LeftJunctionText;
            leftSwitchAction.Action = JunctionSwitchAction;
            // TODO figure out why doesn't work
            leftSwitchAction.Icon = @"Textures\Icons\HoverRail\HoverRail_Junction_Left_10x-12x_OnOff.dds";
            MyAPIGateway.TerminalControls.AddAction <IMyTerminalBlock>(leftSwitchAction);

            leftSwitchLeftAction        = MyAPIGateway.TerminalControls.CreateAction <IMyTerminalBlock>("HoverRailLeftJunction_Left");
            leftSwitchLeftAction.Name   = new StringBuilder("Go Left");
            leftSwitchLeftAction.Writer = LeftJunctionText;
            leftSwitchLeftAction.Action = JunctionSwitchSideAction;
            leftSwitchLeftAction.Icon   = @"Textures\Icons\HoverRail\HoverRail_Junction_Left_10x-12x_On.dds";
            MyAPIGateway.TerminalControls.AddAction <IMyTerminalBlock>(leftSwitchLeftAction);

            leftSwitchStraightAction        = MyAPIGateway.TerminalControls.CreateAction <IMyTerminalBlock>("HoverRailLeftJunction_Straight");
            leftSwitchStraightAction.Name   = new StringBuilder("Go Fwd");
            leftSwitchStraightAction.Writer = LeftJunctionText;
            leftSwitchStraightAction.Action = JunctionSwitchStraightAction;
            leftSwitchStraightAction.Icon   = @"Textures\Icons\HoverRail\HoverRail_Junction_Left_10x-12x_Off.dds";
            MyAPIGateway.TerminalControls.AddAction <IMyTerminalBlock>(leftSwitchStraightAction);

            rightSwitchAction        = MyAPIGateway.TerminalControls.CreateAction <IMyTerminalBlock>("HoverRailRightJunction_Switch");
            rightSwitchAction.Name   = new StringBuilder("Switch Direction");
            rightSwitchAction.Writer = RightJunctionText;
            rightSwitchAction.Action = JunctionSwitchAction;
            // rightSwitchAction.Icon = @"Textures\Icons\HoverRail\HoverRail_Junction_Right_10x-12x_OnOff.dds";
            MyAPIGateway.TerminalControls.AddAction <IMyTerminalBlock>(rightSwitchAction);

            rightSwitchStraightAction        = MyAPIGateway.TerminalControls.CreateAction <IMyTerminalBlock>("HoverRailRightJunction_Straight");
            rightSwitchStraightAction.Name   = new StringBuilder("Go Fwd");
            rightSwitchStraightAction.Writer = RightJunctionText;
            rightSwitchStraightAction.Action = JunctionSwitchStraightAction;
            // rightSwitchStraightAction.Icon = @"Textures\Icons\HoverRail\HoverRail_Junction_Right_10x-12x_Off.dds";
            MyAPIGateway.TerminalControls.AddAction <IMyTerminalBlock>(rightSwitchStraightAction);

            rightSwitchRightAction        = MyAPIGateway.TerminalControls.CreateAction <IMyTerminalBlock>("HoverRailRightJunction_Right");
            rightSwitchRightAction.Name   = new StringBuilder("Go Right");
            rightSwitchRightAction.Writer = RightJunctionText;
            rightSwitchRightAction.Action = JunctionSwitchSideAction;
            // rightSwitchRightAction.Icon = @"Textures\Icons\HoverRail\HoverRail_Junction_Right_10x-12x_On.dds";
            MyAPIGateway.TerminalControls.AddAction <IMyTerminalBlock>(rightSwitchRightAction);

            MyAPIGateway.TerminalControls.CustomActionGetter += GetSwitchActions;
        }