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