Example #1
0
 protected virtual void UseRangeWeapon()
 {
     if (target.CanAttack() && target.state != WOState.Attacking)
     {
         target.BeginAttack(this);
     }
 }
        public static void HandleSingleModeAttack(StateController controller)
        {
            WorldObject controlledObject = controller.controlledObject;
            WorldObject chaseTarget      = controller.chaseTarget;

            // if no target or canot attack, return
            if (chaseTarget == null || !controlledObject.CanAttack())
            {
                return;
            }

            Vector3 currentPosition      = controlledObject.transform.position;
            Vector3 currentEnemyPosition = WorkManager.GetTargetClosestPoint(controlledObject, chaseTarget);
            Vector3 direction            = currentEnemyPosition - currentPosition;

            if (
                direction.sqrMagnitude < controlledObject.weaponRange * controlledObject.weaponRange
                )
            {
                controller.attacking = true;
                controlledObject.PerformAttack(chaseTarget);
            }
            else
            {
                controller.attacking = false;
            }

            // controller.MarkChaseTarget();
        }
        private bool ListenToFriendsTarget(StateController controller)
        {
            WorldObject unit            = controller.controlledObject;
            Vector3     currentPosition = unit.transform.position;

            if (unit.CanAttack())
            {
                // if there is no common target, look for nearby enemies
                foreach (WorldObject nearbyObject in controller.nearbyAllies)
                {
                    if (
                        nearbyObject &&
                        unit.ObjectId != nearbyObject.ObjectId &&
                        nearbyObject.GetStateController() &&
                        nearbyObject.GetStateController().chaseTarget
                        )
                    {
                        controller.chaseTarget = nearbyObject.GetStateController().chaseTarget;

                        return(true);
                    }
                }
            }

            return(false);
        }
    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);
            }
        }
    }