private void IssueMoveOrderToUnit(Unit objectHandler, GameObject hitObject, Vector3 hitPoint, Vector3 formationOffset)
    {
        var handlerStateController = objectHandler.GetStateController();

        if (handlerStateController && hitPoint != ResourceManager.InvalidPosition)
        {
            Vector3 idealDestination = hitPoint + formationOffset;
            if (!WorkManager.ObjectIsGround(hitObject))
            {
                Vector3?onNavMeshDest = WorkManager.GetClosestPointOnNavMesh(hitPoint, "Walkable", 7);

                if (onNavMeshDest.HasValue)
                {
                    idealDestination = onNavMeshDest.Value;
                }
            }

            Vector3 actualDestination = hitPoint;
            Vector3 destDifference    = hitPoint - idealDestination;

            for (int i = 0; i < 5; i++)
            {
                var potentialDest = WorkManager.GetClosestPointOnNavMesh(idealDestination + (destDifference / 4 * i), "Walkable", 2);

                if (potentialDest.HasValue)
                {
                    actualDestination = potentialDest.Value;
                    break;
                }
            }

            EventManager.TriggerEvent(EventNames.RELOCATE_UNIT);
            InputToCommandManager.ToBusyState(targetManager, handlerStateController, actualDestination);
        }
    }
 private void SwitchFormationType()
 {
     if (Input.GetButtonDown(InputNames.SWITCH_FORMATION) || (Gamepad.GetButton(InputNames.SELECTION_MODIFIER) && Gamepad.GetButtonDown(InputNames.ABILITY1)))
     {
         EventManager.TriggerEvent(EventNames.SWITCH_FORMATION_COMMAND);
         InputToCommandManager.SwitchFormationType(formationManager);
     }
 }
 private void SwitchHoldPosition()
 {
     if (Input.GetButtonDown(InputNames.HOLD_POSITION) || (Gamepad.GetButton(InputNames.SELECTION_MODIFIER) && Gamepad.GetButtonDown(InputNames.ABILITY2)))
     {
         EventManager.TriggerEvent(EventNames.SWITCH_HOLD_POSIITON_COMMAND);
         InputToCommandManager.SwitchHoldPosition(player);
     }
 }
 private void StopUnits()
 {
     if (Input.GetButtonDown(InputNames.STOP_UNITS) || (Gamepad.GetButton(InputNames.SELECTION_MODIFIER) && Gamepad.GetButtonDown(InputNames.ABILITY4)))
     {
         EventManager.TriggerEvent(EventNames.STOP_COMMAND);
         InputToCommandManager.StopUnits(player, targetManager);
     }
 }
 private void AttackModeSelection()
 {
     if (player.selectedAllyTargettingAbility == null && (Input.GetButtonDown(InputNames.ATTACK_MODE) || Gamepad.GetButtonDown(InputNames.ATTACK_MODE)))
     {
         // get all the objects controlled through AI
         var stateControlles = player.GetComponentsInChildren <UnitStateController>();
         EventManager.TriggerEvent(EventNames.SWITCH_ATTACK_MODE_COMMAND);
         InputToCommandManager.SwitchAttackMode(targetManager, new List <UnitStateController>(stateControlles));
     }
 }
    private void WorldObjectMouseClick(WorldObject objectHandler, GameObject hitObject, Vector3 hitPoint)
    {
        //only handle input if currently selected
        if (objectHandler.IsSelected() && !WorkManager.ObjectIsGround(hitObject))
        {
            if (!hitObject.transform.parent)
            {
                return;
            }

            WorldObject worldObject = hitObject.transform.parent.GetComponent <WorldObject>();
            //clicked on another selectable object
            if (worldObject)
            {
                Player owner = hitObject.transform.root.GetComponent <Player>();
                if (owner)
                { //the object is controlled by a player
                    // get owner of the object handler
                    Player objectHandlerOwner = objectHandler.GetComponentInParent <Player>();
                    if (objectHandlerOwner && player && objectHandlerOwner.username == player.username && player.human)
                    { //this object is controlled by a human player
                        var handlerStateController = objectHandler.GetStateController();
                        //start attack if object is not owned by the same player and this object can attack, else select
                        if (handlerStateController && player.username != owner.username && objectHandler.CanAttack())
                        {
                            InputToCommandManager.ToChaseState(targetManager, handlerStateController, worldObject);
                        }
                        else
                        {
                            IssueMoveOrderToSelectedUnits(hitObject, hitPoint);
                        }
                    }
                }
                else if (objectHandler.CanAttack())
                {
                    if (!hitObject.transform.parent)
                    {
                        return;
                    }

                    Unit     unit     = hitObject.transform.parent.GetComponent <Unit>();
                    Building building = hitObject.transform.parent.GetComponent <Building>();
                    BossPart bossPart = hitObject.transform.parent.GetComponent <BossPart>();

                    var handlerStateController = objectHandler.GetStateController();

                    if ((unit || building || bossPart) && handlerStateController)
                    {
                        InputToCommandManager.ToChaseState(targetManager, handlerStateController, worldObject);
                    }
                }
                // else ChangeSelection(objectHandler, worldObject);
            }
        }
    }
    private void SwitchEnemy()
    {
        if (Input.GetButtonDown(InputNames.NEXT_ENEMY) || (Gamepad.GetButton(InputNames.SELECTION_MODIFIER) && Gamepad.GetButtonDown(InputNames.ABILITY3)))
        {
            var majorVisibleEnemies = UnitManager.GetPlayerVisibleMajorEnemies(player).Cast <WorldObject>();
            var visibleBuildings    = UnitManager.GetVisibleEnemyBuildings(player);
            var visibleBossParts    = UnitManager.GetVisibleEnemyBossParts(player);

            var enemiesToDisplay = majorVisibleEnemies
                                   .Concat(visibleBuildings)
                                   .Concat(visibleBossParts)
                                   .ToList();

            enemiesToDisplay.Sort((a, b) => a.ObjectId - b.ObjectId);

            if (targetManager)
            {
                int selectionIdx = WorkManager.GetTargetSelectionIndex(targetManager.SingleTarget, enemiesToDisplay);

                EventManager.TriggerEvent(EventNames.SWITCH_ENEMY_COMMAND);
                InputToCommandManager.SwitchEnemy(targetManager, enemiesToDisplay, selectionIdx);
            }
        }
    }