private void UpdateControl()
        {
            MyShipController preferredController = null;

            foreach (var controller in m_groupControllers)
            {
                if (preferredController == null)
                {
                    preferredController = controller;
                }
                else
                {
                    if (MyShipController.HasPriorityOver(controller, preferredController))
                    {
                        preferredController = controller;
                    }
                }
            }

            m_currentShipController = preferredController;

            // The server synchronizes control to all clients, but current ship controller is determined by each client separately
            if (Sync.IsServer && m_currentShipController != null)
            {
                var newController = m_currentShipController.ControllerInfo.Controller;
                foreach (var grid in m_cubeGrids)
                {
                    Debug.Assert(m_firstControlRecalculation || Sync.Players.GetControllingPlayer(grid) == null);
                    Debug.Assert(m_currentShipController.ControllerInfo.Controller != null || m_currentShipController is MyRemoteControl, "Trying to extend control from uncontrolled cockpit!");

                    Sync.Players.TryExtendControl(m_currentShipController, grid);
                }
            }
        }
		public ShipControllerBlock(IMyCubeBlock block)
		{
			m_logger = new Logger(GetType().Name, block);
			Controller = block as MyShipController;
			CubeBlock = block;
			Terminal = block as IMyTerminalBlock;
			Pseudo = new PseudoBlock(block);
		}
        public void RemoveControllerBlock(MyShipController controllerBlock)
        {
            bool result = m_groupControllers.Remove(controllerBlock);
            Debug.Assert(result, "Controller block was not present in the control group's controller list!");

            if (controllerBlock == m_currentShipController)
                m_controlDirty = true;

            if (Sync.IsServer)
            {
                if (controllerBlock == m_currentShipController)
                {
                    Sync.Players.ReduceAllControl(m_currentShipController);
                    m_currentShipController = null;
                }
            }
        }
 public MySyncShipController(MyShipController shipController) :
     base(shipController)
 {
     this.m_shipController = shipController;
 }
 public MyGroupControlSystem()
 {
     m_currentShipController = null;
     m_controlDirty = false;
     m_firstControlRecalculation = true;
 }
        public void AddControllerBlock(MyShipController controllerBlock)
        {
            bool result = m_groupControllers.Add(controllerBlock);
            bool found = false;
            if (m_currentShipController != null && m_currentShipController.CubeGrid != controllerBlock.CubeGrid)
            {
               
                var group = MyCubeGridGroups.Static.Logical.GetGroup(controllerBlock.CubeGrid);

                if (group != null)
                {
                   foreach(var node in group.Nodes)
                   {
                       if(node.NodeData == m_currentShipController.CubeGrid )
                       {
                           found = true;
                           break;
                       }
                   }
                }
            }

            if (found == false && m_currentShipController != null && m_currentShipController.CubeGrid != controllerBlock.CubeGrid)
            {
                RemoveControllerBlock(m_currentShipController);
                m_currentShipController = null;
            }

            bool newControllerHasPriority = m_currentShipController == null || MyShipController.HasPriorityOver(controllerBlock, m_currentShipController);

            if (newControllerHasPriority)
                m_controlDirty = true;

            if (Sync.IsServer)
            {
                if (m_currentShipController != null && newControllerHasPriority)
                {
                    Sync.Players.ReduceAllControl(m_currentShipController);
                }
            }
        }
        // Returns true when the first controller has priority
        public static bool HasPriorityOver(MyShipController first, MyShipController second)
        {
            Debug.Assert(first.CubeGrid != null, "Ship controller cube grid was null");
            Debug.Assert(second.CubeGrid != null, "Ship controller cube grid was null");

            if (first.Priority < second.Priority) return true;
            if (first.Priority > second.Priority) return false;

            if (first.CubeGrid.Physics == null && second.CubeGrid.Physics == null)
            {
                return first.CubeGrid.BlocksCount > second.CubeGrid.BlocksCount;
            }
            else if (first.CubeGrid.Physics != null && second.CubeGrid.Physics != null)
            {
                return first.CubeGrid.Physics.Mass > second.CubeGrid.Physics.Mass;
            }
            else
            {
                return first.CubeGrid.Physics == null;
            }
        }
        private void SetupSpaceshipScreen(MyShipController ship)
        {
            m_lightsControlHelper.SetEntity(ship);
            m_dampingControlHelper.SetEntity(ship);
            m_landingGearsControlHelper.SetEntity(ship);
            m_reactorsControlHelper.SetEntity(ship);
            m_showBuildScreenControlHelper.SetEntity(ship);
            m_showTerminalControlHelper.SetEntity(ship);

            m_controlMenu = new MyGuiScreenControlMenu();

            m_controlMenu.AddItem(m_showTerminalControlHelper);
            m_controlMenu.AddItem(m_showBuildScreenControlHelper);

            m_controlMenu.AddItem(m_quickLoadControlHelper);
            m_controlMenu.AddItem(m_hudToggleControlHelper);

            m_controlMenu.AddItem(m_lightsControlHelper);
            m_controlMenu.AddItem(m_dampingControlHelper);
            m_controlMenu.AddItem(m_landingGearsControlHelper);
            m_controlMenu.AddItem(m_reactorsControlHelper);

            m_controlMenu.AddItem(m_cameraModeControlHelper);
        }
 public MyGridSelectionSystem(MyShipController shipController)
 {
     m_shipController = shipController;
 }
        public void AddControllerBlock(MyShipController controllerBlock)
        {
            bool result = m_groupControllers.Add(controllerBlock);
            Debug.Assert(result, "Controller block was already present in the control group's controller list!");

            bool newControllerHasPriority = m_currentShipController == null || MyShipController.HasPriorityOver(controllerBlock, m_currentShipController);

            if (newControllerHasPriority)
                m_controlDirty = true;

            if (Sync.IsServer)
            {
                if (m_currentShipController != null && newControllerHasPriority)
                {
                    Sync.Players.ReduceAllControl(m_currentShipController);
                }
            }
        }
 public void AttachedToShipController(MyShipController newShipController)
 {
     ShipController = newShipController;
     OnShipControllerChanged();
 }