Esempio n. 1
0
        public void Install()
        {
            if (IsInstalled || IsFaulted)
            {
                return;
            }

            // Custom terminal control needs to be initialized after game controls otherwise game fails it initialize it's own
            if (!MyTerminalControlFactory.AreControlsCreated <MyProgrammableBlock>())
            {
                return;
            }

            if (MyTerminalControlFactory.GetControls(typeof(MyProgrammableBlock)).Any(x => x.Id == "MDK-Debug-BindScriptDLL"))
            {
                return;
            }

            IsInstalled = true;

            var editIndex = FindEditButtonIndex();

            if (editIndex < 0)
            {
                MyLog.Default.WriteLine($"{Plugin.Ident}: {Resources.ProgrammableBlockExtensions_Install_NoEditButton}");
                MyAPIGateway.Utilities.ShowMessage(Plugin.Ident, Resources.ProgrammableBlockExtensions_Install_NoEditButton);
                IsInstalled = true;
                IsFaulted   = true;
                return;
            }

            var button = new MyTerminalControlButton <MyProgrammableBlock>("MDK-Debug-UnbindScriptDll", MyStringId.GetOrCompute($"{Plugin.Ident}: {Resources.ProgrammableBlockExtensions_Install_UnbindDLLButtonText}"), MyStringId.NullOrEmpty, OnUnbindScriptDll)
            {
                Visible = IsUnbindButtonVisible,
                Enabled = IsUnbindButtonEnabled
            };

            MyTerminalControlFactory.AddControl(editIndex, button);

            button = new MyTerminalControlButton <MyProgrammableBlock>("MDK-Debug-BindScriptDLL", MyStringId.GetOrCompute($"{Plugin.Ident}: {Resources.ProgrammableBlockExtensions_Install_BindDLLButtonText}"), MyStringId.NullOrEmpty, OnBindScriptDll)
            {
                Visible = IsBindButtonVisible,
                Enabled = IsBindButtonEnabled,
            };
            MyTerminalControlFactory.AddControl(editIndex, button);

            button = new MyTerminalControlButton <MyProgrammableBlock>("MDK-Debug-AttachDebugger", MyStringId.GetOrCompute($"{Plugin.Ident}: {Resources.ProgrammableBlockExtensions_Install_AttachDebugger}"), MyStringId.NullOrEmpty, OnAttachDebugger)
            {
                Visible = IsAttachDebuggerButtonVisible,
                Enabled = IsAttachDebuggerButtonEnabled
            };
            MyTerminalControlFactory.AddControl(editIndex, button);

            MySession.OnUnloading += Unload;

            MyLog.Default.WriteLine($"{Plugin.Ident}: {Resources.ProgrammableBlockExtensions_Install_Ready}");
            MyAPIGateway.Utilities.ShowMessage(Plugin.Ident, Resources.ProgrammableBlockExtensions_Install_Ready);
        }
        private void RecreateBlockControls()
        {
            m_currentControls.Clear();
            m_terminalControlList.Controls.Clear();

            try
            {
                foreach (var block in m_currentBlocks)
                {
                    var type = block.GetType();
                    foreach (var control in MyTerminalControlFactory.GetControls(block.GetType()))
                    {
                        int num;
                        m_tmpControlDictionary.TryGetValue(control, out num);
                        m_tmpControlDictionary[control] = num + (control.IsVisible(block) ? 1 : 0);
                    }
                }

                if (MySession.Static.Settings.ScenarioEditMode && MyFakes.ENABLE_NEW_TRIGGERS)
                {
                    var scenarioType = typeof(MyTerminalBlock);
                    var c            = MyTerminalControlFactory.GetControls(scenarioType);
                    foreach (var control in c)
                    {
                        m_tmpControlDictionary[control] = m_currentBlocks.Length;
                    }
                }

                int blockCount = m_currentBlocks.Length;
                foreach (var item in m_tmpControlDictionary)
                {
                    bool visibleAtLeastOnce = item.Value != 0;

                    if (blockCount > 1 && !item.Key.SupportsMultipleBlocks)
                    {
                        continue;
                    }

                    if (item.Value == blockCount)
                    {
                        item.Key.GetGuiControl().Visible = visibleAtLeastOnce;

                        m_terminalControlList.Controls.Add(item.Key.GetGuiControl());
                        item.Key.TargetBlocks = m_currentBlocks;
                        item.Key.UpdateVisual();

                        m_currentControls.Add(item.Key);
                    }
                }
            }
            finally
            {
                m_tmpControlDictionary.Clear();
            }
        }
Esempio n. 3
0
        int FindEditButtonIndex()
        {
            var controls = MyTerminalControlFactory.GetControls(typeof(MyProgrammableBlock));

            for (var i = 0; i < controls.Count; i++)
            {
                if (controls.ItemAt(i).Id == "Edit")
                {
                    return(i);
                }
            }

            return(-1);
        }
Esempio n. 4
0
        private void RecreateBlockControls()
        {
            m_currentControls.Clear();
            m_terminalControlList.Controls.Clear();

            try
            {
                foreach (var block in m_currentBlocks)
                {
                    var type = block.GetType();
                    foreach (var control in MyTerminalControlFactory.GetControls(block.GetType()))
                    {
                        int num;
                        m_tmpControlDictionary.TryGetValue(control, out num);
                        m_tmpControlDictionary[control] = num + (control.IsVisible(block) ? 1 : 0);
                    }
                }

                int blockCount = m_currentBlocks.Length;
                foreach (var item in m_tmpControlDictionary)
                {
                    bool visibleAtLeastOnce = item.Value != 0;

                    if (blockCount > 1 && !item.Key.SupportsMultipleBlocks)
                    {
                        continue;
                    }

                    if (item.Value == blockCount)
                    {
                        item.Key.GetGuiControl().Visible = visibleAtLeastOnce;

                        m_terminalControlList.Controls.Add(item.Key.GetGuiControl());
                        item.Key.TargetBlocks = m_currentBlocks;
                        item.Key.UpdateVisual();

                        m_currentControls.Add(item.Key);
                    }
                }
            }
            finally
            {
                m_tmpControlDictionary.Clear();
            }
        }
Esempio n. 5
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;
                }
            }
        }