Beispiel #1
0
    protected virtual void OnUpdate(IM.Number fDeltaTime)
    {
        if (m_player.m_StateMachine.m_curState.m_eState == PlayerState.State.eHold &&
            m_player.m_bMovedWithBall)
        {
            m_system.SetTransaction(Type.ePass);
            return;
        }

        if (!m_player.m_bWithBall || !m_match.m_ruler.m_bToCheckBall)
        {
            m_system.SetTransaction(Type.eIdle, new IM.Number(20));
            m_system.SetTransaction(Type.ePositioning, new IM.Number(80));
            return;
        }

        if (m_player.m_team.GetMemberCount() > 1)
        {
            foreach (Player member in m_player.m_team.members)
            {
                if (member == m_player)
                {
                    continue;
                }
                if (member.m_StateMachine.m_curState.m_eState == PlayerState.State.eRequireBall &&
                    m_match.mCurScene.mGround.GetArea(member) == Area.eFar)
                {
                    AI_Pass pass = m_system.GetState(Type.ePass) as AI_Pass;
                    pass.m_toPass = member;
                    m_system.SetTransaction(pass);
                    return;
                }
            }
        }

        Player defender = m_player.m_defenseTarget;

        if (defender != null && defender.m_AOD.GetStateByPos(m_player.position) != AOD.Zone.eInvalid)
        {
            IM.Vector3 dirBasket2Player   = GameUtils.HorizonalNormalized(m_player.position, m_match.mCurScene.mBasket.m_vShootTarget);
            IM.Vector3 dirPlayer2Defender = GameUtils.HorizonalNormalized(defender.position, m_player.position);
            IM.Number  angle = IM.Vector3.FromToAngle(dirBasket2Player, dirPlayer2Defender);
            if (0 <= angle && angle < 90)               // Defender at right side.
            {
                IM.Vector3 dirMove = IM.Quaternion.AngleAxis(-new IM.Number(40), IM.Vector3.up) * dirBasket2Player;
                m_moveTarget = m_player.position + dirMove * IM.Number.two;
            }
            else if (270 < angle && angle < 360)                // Defender at left side.
            {
                IM.Vector3 dirMove = IM.Quaternion.AngleAxis(new IM.Number(40), IM.Vector3.up) * dirBasket2Player;
                m_moveTarget = m_player.position + dirMove * IM.Number.two;
            }
        }
        else
        {
            m_moveTarget = GetMoveTarget();
        }
    }
Beispiel #2
0
    bool Pass()
    {
        IM.Number passWeight = m_player.IsDefended(m_system.AI.devAngleAttacker, m_system.AI.devDistAOD) ? new IM.Number(30) : IM.Number.zero;
        Player    target     = AIUtils.GetMostPriorPassTarget(m_player.m_team.members, m_player);

        if (target != null && target != m_player)
        {
            //目标要球,权重提高
            if (target.m_StateMachine.m_curState.m_eState == PlayerState.State.eRequireBall)
            {
                IM.Number weightAdj = IM.Number.zero;
                switch (m_player.m_position)
                {
                case PositionType.PT_C:
                case PositionType.PT_PG:
                    weightAdj = new IM.Number(200);
                    break;

                case PositionType.PT_PF:
                    weightAdj = new IM.Number(50);
                    break;

                case PositionType.PT_SF:
                case PositionType.PT_SG:
                    weightAdj = new IM.Number(20);
                    break;
                }
                passWeight += weightAdj;
            }
            if (passWeight > IM.Number.zero)
            {
                AI_Pass pass = m_system.GetState(Type.ePass) as AI_Pass;
                pass.m_toPass = target;
                m_system.SetTransaction(pass, passWeight);
                return(true);
            }
        }
        return(false);
    }
Beispiel #3
0
 protected override void OnTick()
 {
     //持球进攻
     if (m_player.m_bWithBall)
     {
         PlayerState.State state = m_player.m_StateMachine.m_curState.m_eState;
         if (m_match.m_ruler.m_bToCheckBall)                 //带出三分线
         {
             if (state == PlayerState.State.eStand ||
                 state == PlayerState.State.eRun ||
                 state == PlayerState.State.eRush ||
                 state == PlayerState.State.eHold)
             {
                 bool inTakeOver = false;
                 if (m_player.m_inputDispatcher != null)
                 {
                     inTakeOver = m_player.m_inputDispatcher.inTakeOver;
                 }
                 if (!inTakeOver)
                 {
                     Player passTarget = AIUtils.ChoosePassTargetCheckBall(m_player, m_match);
                     if (passTarget != null)
                     {
                         AI_Pass pass = m_system.GetState(Type.ePass) as AI_Pass;
                         pass.m_toPass = passTarget;
                         m_system.SetTransaction(pass);
                     }
                     else
                     {
                         m_system.SetTransaction(AIState.Type.eCheckBall);
                     }
                 }
                 else
                 {
                     m_system.SetTransaction(AIState.Type.eCheckBall);
                 }
             }
         }
         else
         {
             if (state == PlayerState.State.eStand ||
                 state == PlayerState.State.eRun ||
                 state == PlayerState.State.eRush)
             {
                 Offense();
             }
             else if (state == PlayerState.State.eHold)
             {
                 if ((m_match.mCurScene.mGround.GetArea(m_player) == Area.eNear ||
                      !m_player.IsDefended(m_system.AI.devAngleAttacker, m_system.AI.devDistAOD)) &&
                     arriveFirstTarget)
                 {
                     Offense();
                 }
                 else
                 {
                     m_system.SetTransaction(AIState.Type.eIdle);
                 }
             }
         }
     }
     else            //非持球进攻
     {
         //空切
         if (arriveFirstTarget && m_ball.m_owner != null && IM.Random.value < new IM.Number(0, 250) &&
             m_player.IsDefended(m_system.AI.devAngleAttacker, m_system.AI.devDistAOD))
         {
             //if( !(m_match is GameMatch_PVP) )
             m_system.SetTransaction(AIState.Type.eCutIn);
         }
         //要球
         else if (m_ball.m_owner != null && m_ball.m_owner.m_team == m_player.m_team && m_system.m_bNotDefended && !m_match.m_ruler.m_bToCheckBall)
         {
             //if( !(m_match is GameMatch_PVP) )
             m_system.SetTransaction(AIState.Type.eRequireBall);
         }
         //靠近球6米,追球
         else if (AIUtils.ShouldTraceBall(m_ball, m_player))
         {
             m_system.SetTransaction(AIState.Type.eIdle);
         }
         //挡拆
         else
         {
             int result = AIUtils.CanPickAndRoll(m_player);
             if (result == 1 && m_player.m_StateMachine.m_curState.IsCommandValid(Command.PickAndRoll))
             {
                 m_system.SetTransaction(AIState.Type.ePickAndRoll);
             }
             else if (result == 2)
             {
                 positionForPR = true;
                 m_system.SetTransaction(AIState.Type.ePositioning, new IM.Number(100), true);
             }
         }
     }
 }
Beispiel #4
0
    void Offense()
    {
        if (unreasonable)
        {
            if (m_player.CanLayup())
            {
                m_system.SetTransaction(AIState.Type.eLayup);
                Debug.LogError("Unreasonable layup.");
                return;
            }
        }

        if (!arriveFirstTarget)
        {
            return;
        }

        bool inTakeOver = false;

        if (m_player.m_inputDispatcher != null)
        {
            inTakeOver = m_player.m_inputDispatcher.inTakeOver;
        }

        bool isPvp = m_system.IsPvp;

        if (!inTakeOver)
        {
            if (!isPvp)
            {
                //进攻时间快结束了,投球
                if (m_match.IsFinalTime(new IM.Number(3) - m_system.AI.devTime))
                {
                    AIUtils.AttackByPosition(m_player, new IM.Number(100));
                    return;
                }
                //玩家要球,传给他
                Player mainRole = m_match.GetMainRole(m_player.m_roleInfo.acc_id);
                if (mainRole != null && mainRole.m_team == m_player.m_team && mainRole != m_player &&
                    mainRole.m_StateMachine.m_curState.m_eState == PlayerState.State.eRequireBall)
                {
                    AI_Pass pass = m_system.GetState(Type.ePass) as AI_Pass;
                    pass.m_toPass = mainRole;
                    m_system.SetTransaction(pass, new IM.Number(100));
                    return;
                }

                //进攻篮筐
                _Attack();
            }

            //传球
            Pass();

            if (!isPvp)
            {
                Area area = m_match.mCurScene.mGround.GetArea(m_player);
                if (area != Area.eNear) //非篮下区
                {
                    if (!inTakeOver)
                    {
                        //突破
                        CrossOver();
                        if (!AIUtils.InAttackableDistance(m_match, m_player))
                        {
                            m_system.SetTransaction(Type.ePositioning, new IM.Number(50), true);
                        }
                    }
                }
            }
        }
        else
        {
            m_system.SetTransaction(Type.ePositioning, new IM.Number(100), true);
        }
    }
    override public void Update(IM.Number fDeltaTime)
    {
        PlayerState state = m_player.m_StateMachine.m_curState;

        if (state.m_eState != PlayerState.State.eCrossOver)
        {
            PlayerState_CrossOver stateCross = m_player.m_StateMachine.GetState(PlayerState.State.eCrossOver) as PlayerState_CrossOver;
            if (stateCross.crossed)                          // Cross over succeed.
            {
                if (IM.Random.value < new IM.Number(0, 300)) // Attack unreasoningly
                {
                    AI_Positioning aiPositioning = m_system.GetState(Type.ePositioning) as AI_Positioning;
                    aiPositioning.unreasonable = true;
                    Debug.Log("Attack unreasonable.");
                }
                else
                {
                    Player defender = m_player.GetDefender();
                    if (defender != null)                       // Still being defended.
                    {
                        List <SkillInstance> basicSkills = m_player.m_skillSystem.GetBasicSkillsByCommand(Command.CrossOver);
                        uint uBasicSkillCost             = basicSkills[0].skill.levels[1].stama;
                        if (m_player.m_stamina.m_curStamina >= new IM.Number((int)uBasicSkillCost))                             // Has enough stamina to cross again.
                        {
                            IM.Number crossRate = PlayerState_CrossOver.CalcCrossRate(m_player, defender);                      // Cross over success rate.
                            if (crossRate > new IM.Number(0, 600))
                            {
                                m_system.SetTransaction(this, new IM.Number(100), true);
                                return;
                            }
                        }
                    }
                }
            }
            else                // Cross over failed.
            {
                if (state.m_eState == PlayerState.State.eStand ||
                    state.m_eState == PlayerState.State.eRun ||
                    state.m_eState == PlayerState.State.eRush ||
                    state.m_eState == PlayerState.State.eHold)
                {
                    Player defender = m_player.GetDefender();
                    if (defender != null)
                    {
                        IM.Number crossRate = PlayerState_CrossOver.CalcCrossRate(m_player, defender); // Cross over success rate.
                        if (crossRate < new IM.Number(0, 200))                                         // Success rate is too low. Pass to teammate.
                        {
                            List <Player> teammates = new List <Player>(m_player.m_team.members);
                            teammates.Remove(m_player);
                            Player target = AIUtils.GetMostPriorPassTarget(teammates, m_player);
                            if (target != null)
                            {
                                AI_Pass passState = m_system.GetState(Type.ePass) as AI_Pass;
                                passState.m_toPass = target;
                                m_system.SetTransaction(passState, new IM.Number(100), true);
                                return;
                            }
                        }
                    }
                }
                else if (state.m_eState == PlayerState.State.eKnocked)                  // Wait knocked state over to do passing
                {
                    return;
                }
            }
            m_system.SetTransaction(AIState.Type.ePositioning);
        }
    }
Beispiel #6
0
    protected override void OnTick()
    {
        GameMatch   match = GameSystem.Instance.mClient.mCurMatch;
        UBasketball ball  = match.mCurScene.mBall;

        bool inTakeOver = false;

        if (m_player.m_inputDispatcher != null)
        {
            inTakeOver = m_player.m_inputDispatcher.inTakeOver;
        }

        if (!inTakeOver)
        {
            //进攻时间快结束了,投球
            if (m_player.m_bWithBall && match.IsFinalTime(new IM.Number(3) - m_system.AI.devTime) && !m_match.m_ruler.m_bToCheckBall)
            {
                AIUtils.AttackByPosition(m_player, new IM.Number(100));
                return;
            }
        }

        //球在飞,追球
        if (m_ball.m_owner == null && m_ball.m_ballState != BallState.eUseBall_Pass)
        {
            if (AIUtils.ShouldTraceBall(m_ball, m_player))
            {
                m_system.SetTransaction(AIState.Type.eTraceBall);
            }
            else if (m_match.m_stateMachine.m_curState.m_eState != MatchState.State.eTipOff)
            {
                m_system.SetTransaction(AIState.Type.ePositioning);
            }
            return;
        }

        if (!inTakeOver)
        {
            //抱球时
            Area area = m_match.mCurScene.mGround.GetArea(m_player);
            if (m_player.m_StateMachine.m_curState.m_eState == PlayerState.State.eHold)
            {
                if (m_player.m_bMovedWithBall)                  //二次运球
                {
                    if (m_player.IsDefended())                  //被防守
                    {
                        if (!m_system.IsPvp)
                        {
                            AIUtils.AttackByPosition(m_player, new IM.Number(15));
                            m_system.SetTransaction(Type.eFakeShoot, new IM.Number(10));
                        }

                        List <Player> teammates = new List <Player>(m_player.m_team.members);
                        teammates.Remove(m_player);
                        Player passTarget = AIUtils.GetMostPriorPassTarget(teammates, m_player);
                        if (passTarget != null)
                        {
                            AI_Pass pass = m_system.GetState(Type.ePass) as AI_Pass;
                            pass.m_toPass = passTarget;
                            m_system.SetTransaction(Type.ePass, new IM.Number(75));
                        }
                    }
                    else                        //未被防守
                    {
                        AIUtils.AttackByPosition(m_player, new IM.Number(100));
                    }
                }
                else                    //非二次运球
                {
                    m_system.SetTransaction(Type.ePositioning);
                }

                return;
            }
        }

        //攻防转换
        if (m_player.m_team.m_role == GameMatch.MatchRole.eOffense)
        {
            if (makePolicyImmediately)
            {
                AI_Positioning aiPositioning = m_system.GetState(AIState.Type.ePositioning) as AI_Positioning;
                aiPositioning.makePolicyImmediately = true;
                makePolicyImmediately = false;
            }
            m_system.SetTransaction(AIState.Type.ePositioning);
        }
        else
        {
            m_system.SetTransaction(AIState.Type.eDefense);
        }
    }