void SendRevengeAttackEvent()
 {
     HandleSound.PlaySoundBerserk();
     Agent.BlackBoard.invulnerable = true;
     _eventAttack = AnimFSMEventAttackMelee.pool.Get();
     _eventAttack.animAttackData = Agent.AnimSet.ProcessCombo(ComboType.REVENGE);
     _eventAttack.attackDir      = Agent.Forward;
     Agent.FSMComponent.SendEvent(_eventAttack);
 }
 public override void OnExit(Phenix.Unity.AI.WorldState ws)
 {
     if (_eventAttack != null)
     {
         _eventAttack.Release();
         _eventAttack = null;
     }
     base.OnExit(ws);
 }
 void SendEvent()
 {
     //Owner.SoundPlayBerserk();
     _eventAttack        = AnimFSMEventAttackMelee.pool.Get();
     _eventAttack.target = Agent.BlackBoard.HasAttackTarget ? Agent.BlackBoard.desiredTarget : null;
     //_eventAttack.attackType = OrderAttackType.COUNTER;
     _eventAttack.attackDir        = Agent.BlackBoard.desiredDirection;
     _eventAttack.attackPhaseStart = false;
     _eventAttack.attackPhaseDone  = false;
     _eventAttack.animAttackData   = Agent.AnimSet.ProcessCombo(ComboType.COUNTER);
     Agent.FSMComponent.SendEvent(_eventAttack);
 }
 public override void Reset()
 {
     base.Reset();
     _injuryPhrase        = 0;
     _eventInjury         = null;
     _eventDeath          = null;
     _eventAttack         = null;
     _attacker            = null;
     _attackerRepeatCount = 0;
     _damageResultType    = DamageResultType.NONE;
     _startTrailTimer     = 0;
 }
    void SendEvent()
    {
        _eventAttack = AnimFSMEventAttackMelee.pool.Get();

        //_eventAttack.attackType = (Agent.PlayerOrder.GetCurOrder() as OrderDataAttack).attackType;
        _eventAttack.attackPhaseStart = false;
        _eventAttack.attackPhaseDone  = false;

        Agent.BlackBoard.desiredTarget = _eventAttack.target = Agent.Decision.SelectTarget(
            Agent.BlackBoard.combatRange, Game1.Instance.AgentMgr.agents);
        if (_eventAttack.target)
        {
            Agent.BlackBoard.desiredDirection = Agent.BlackBoard.desiredTarget.Position - Agent.Position;
            Agent.BlackBoard.desiredDirection.Normalize();
            _eventAttack.attackDir = Agent.BlackBoard.desiredDirection;
        }
        else
        {
            _eventAttack.attackDir = Agent.Forward;
        }

        if (_eventAttack.target != null && _eventAttack.target.BlackBoard.IsKnockedDown)
        {
            _eventAttack.animAttackData = Agent.AnimSet.ProcessCombo(ComboType.JUMP_KILL);
            //_eventAttack.attackType = OrderAttackType.FATALITY;
        }
        else
        {
            _eventAttack.animAttackData = Agent.AnimSet.ProcessOrderCombo((Agent.PlayerOrder.GetCurOrder() as OrderDataAttack).attackType /*_eventAttack.attackType*/);
        }

        /*ComboMgr comboMgr = Agent.transform.GetComponent<ComboMgr>();
         * if (comboMgr != null)
         * {
         *  if (_eventAttack.target != null && _eventAttack.target.BlackBoard.IsKnockedDown)
         *  {
         *      _eventAttack.animAttackData = Agent.AnimSet.GetFirstAttackAnim(
         *          Agent.BlackBoard.weaponSelected, AttackType.FATALITY);
         *      _eventAttack.attackType = AttackType.FATALITY;
         *      comboMgr.Reset();
         *  }
         *  else
         *      _eventAttack.animAttackData = comboMgr.ProcessCombo(_eventAttack.attackType);
         * }
         * else
         * {
         *  _eventAttack.animAttackData = Agent.GetComponent<AnimSet>().GetFirstAttackAnim(
         *      Agent.BlackBoard.weaponSelected, _eventAttack.attackType);
         * }        */

        Agent.FSMComponent.SendEvent(_eventAttack);
    }
 public override void OnExit(Phenix.Unity.AI.WorldState ws)
 {
     Agent.BlackBoard.invulnerable = false;
     if (_eventInjury != null)
     {
         _eventInjury.Release();
         _eventInjury = null;
     }
     if (_eventDeath != null)
     {
         _eventDeath.Release();
         _eventDeath = null;
     }
     if (_eventAttack != null)
     {
         _eventAttack.Release();
         _eventAttack = null;
     }
     base.OnExit(ws);
 }
    void SendEvent()
    {
        _eventAttack = AnimFSMEventAttackMelee.pool.Get();

        if (Agent.BlackBoard.desiredTarget)
        {
            Agent.BlackBoard.desiredDirection = Agent.BlackBoard.desiredTarget.Position - Agent.Position;
            Agent.BlackBoard.desiredDirection.Normalize();
            _eventAttack.attackDir = Agent.BlackBoard.desiredDirection;
            _eventAttack.target    = Agent.BlackBoard.HasAttackTarget ? Agent.BlackBoard.desiredTarget : null;
        }
        else
        {
            _eventAttack.attackDir = Agent.Forward;
        }

        _eventAttack.animAttackData   = Agent.AnimSet.ProcessSingle(ComboType.SINGLE_SWORD);
        _eventAttack.attackPhaseStart = false;
        _eventAttack.attackPhaseDone  = false;
        Agent.FSMComponent.SendEvent(_eventAttack);
    }
    protected override void Initialize(FSMEvent ev = null)
    {
        _eventAttackMelee = ev as AnimFSMEventAttackMelee;

        _attackStatus = AttackStatus.PREPARING;
        Agent.BlackBoard.motionType = MotionType.ATTACK;
        _startRotation = Agent.Transform.rotation;
        _startPosition = Agent.Transform.position;

        if (_eventAttackMelee.target != null)
        {
            float angle    = 0;
            float distance = 0;

            Vector3 finalDir = _eventAttackMelee.target.Position - Agent.Transform.position;
            distance = finalDir.magnitude;
            if (distance > 0.1f)
            {
                finalDir.Normalize();
                angle = Vector3.Angle(Agent.Transform.forward, finalDir);
                if (angle < 40 && Vector3.Angle(Agent.Forward, _eventAttackMelee.target.Forward) < 80)
                {
                    _backHit = true;
                }
            }
            else
            {
                finalDir = Agent.Transform.forward;
            }

            _finalRotation.SetLookRotation(finalDir);

            if (distance < Agent.BlackBoard.weaponRange ||
                Agent.BlackBoard.allowedFlashToWeaponRange == false ||
                distance > Agent.BlackBoard.combatRange * 1.2f)
            {
                _finalPosition = _startPosition;
                _rotationTime  = angle / 720.0f;
            }
            else
            {
                // flash
                if (distance >= Agent.BlackBoard.weaponRange * 1.5)
                {
                    if (Agent.BlackBoard.showMotionEffect)
                    {
                        ParticleTools.Instance.Play(Agent.particleSystemFlashTust,
                                                    (_eventAttackMelee.target.Position - Agent.Position).RadianInXZ());
                    }
                }
                _finalPosition = _eventAttackMelee.target.transform.position - finalDir * Agent.BlackBoard.weaponRange;
                Agent.Transform.LookAt(_eventAttackMelee.target.transform);
                _rotationTime = 0;
            }

            _moveTime = (_finalPosition - _startPosition).magnitude / 20.0f;
        }
        else
        {
            _finalRotation.SetLookRotation(_eventAttackMelee.attackDir);
            _rotationTime = Vector3.Angle(Agent.Transform.forward, _eventAttackMelee.attackDir) / 720.0f;
            _moveTime     = 0;
        }

        _rotationOk          = (_rotationTime == 0);
        _positionOK          = (_moveTime == 0);
        _currentRotationTime = 0;
        _currentMoveTime     = 0;

        _isCritical = IsCritical();
        _knockdown  = IsKnockDown();

        _hitTimeStart = false;
    }
 public override void Reset()
 {
     base.Reset();
     _eventAttack = null;
 }
Beispiel #10
0
 // Update is called once per frame
 protected override void Update()
 {
     base.Update();
     if (Input.GetKey(KeyCode.Alpha1))
     {
         AnimFSMEventGoTo ev = AnimFSMEventGoTo.pool.Get();
         ev.moveType      = MoveType.FORWARD;
         ev.motionType    = MotionType.RUN;
         ev.finalPosition = Agent.Decision.GetBestAttackStart(Agent.BlackBoard.desiredTarget);
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha2))
     {
         AnimFSMEventShowHideSword ev = AnimFSMEventShowHideSword.pool.Get();
         ev.show = true;
         Agent.BlackBoard.weaponState = WeaponState.IN_HAND;
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha3))
     {
         AnimFSMEventIdle ev = AnimFSMEventIdle.pool.Get();
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha4))
     {
         AnimFSMEventRotate ev = AnimFSMEventRotate.pool.Get();
         ev.target = Agent.BlackBoard.desiredTarget;
         //ev.rotationModifier = 0.8f;
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha5))
     {
         AnimFSMEventCombatMove ev = AnimFSMEventCombatMove.pool.Get();
         ev.target = Agent.BlackBoard.desiredTarget;
         ev.minDistanceToTarget = 3;
         ev.moveType            = MoveType.FORWARD;
         if (Agent.agentType == AgentType.DOUBLE_SWORDS_MAN || Agent.agentType == AgentType.SWORD_MAN) // 这里暂时偷个懒,另外扩展一个不同参数的goapaction才是更灵活的做法
         {
             ev.motionType        = MotionType.WALK;
             ev.totalMoveDistance = Agent.BlackBoard.DistanceToDesiredTarget - (Agent.BlackBoard.combatRange * 0.8f);
         }
         else
         {
             ev.totalMoveDistance = UnityEngine.Random.Range((Agent.BlackBoard.DistanceToDesiredTarget - (Agent.BlackBoard.combatRange * 0.5f)) * 0.5f,
                                                             Agent.BlackBoard.DistanceToDesiredTarget - (Agent.BlackBoard.combatRange * 0.5f));
         }
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha6))
     {
         AnimFSMEventCombatMove ev = AnimFSMEventCombatMove.pool.Get();
         ev.moveType            = MoveType.BACKWARD;
         ev.target              = Agent.BlackBoard.desiredTarget;
         ev.minDistanceToTarget = 0;
         if (Agent.agentType == AgentType.DOUBLE_SWORDS_MAN) // 这里暂时偷个懒,另外扩展一个不同参数的goapaction才是更灵活的做法
         {
             ev.motionType        = MotionType.RUN;
             ev.totalMoveDistance = UnityEngine.Random.Range(4f, 6f);
         }
         else
         {
             ev.totalMoveDistance = UnityEngine.Random.Range(2f, 5f);
         }
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha7))
     {
         AnimFSMEventCombatMove ev = AnimFSMEventCombatMove.pool.Get();
         ev.moveType            = MoveType.LEFTWARD;
         ev.target              = Agent.BlackBoard.desiredTarget;
         ev.totalMoveDistance   = UnityEngine.Random.Range(2.0f, 4.0f);
         ev.minDistanceToTarget = Agent.BlackBoard.DistanceToDesiredTarget * 0.7f;
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha8))
     {
         AnimFSMEventCombatMove ev = AnimFSMEventCombatMove.pool.Get();
         ev.moveType            = MoveType.RIGHTWARD;
         ev.target              = Agent.BlackBoard.desiredTarget;
         ev.totalMoveDistance   = UnityEngine.Random.Range(2.0f, 4.0f);
         ev.minDistanceToTarget = Agent.BlackBoard.DistanceToDesiredTarget * 0.7f;
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha9))
     {
         AnimFSMEventShowHideSword ev = AnimFSMEventShowHideSword.pool.Get();
         ev.show = false;
         Agent.BlackBoard.weaponState = WeaponState.NOT_IN_HANDS;
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha0))
     {
         AnimFSMEventAttackMelee ev = AnimFSMEventAttackMelee.pool.Get();
         ev.target = Agent.BlackBoard.desiredTarget;
         //ev.attackType = OrderAttackType.X;
         //ev.animAttackData = Agent.GetComponent<AnimSet>().GetFirstAttackAnim(Agent.BlackBoard.weaponSelected,
         //  ev.attackType);
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Minus))
     {
         AnimFSMEventAttackWhirl ev = AnimFSMEventAttackWhirl.pool.Get();
         ev.data = Agent.GetComponent <AnimSet>().GetWhirlAttackAnim();
         Agent.FSMComponent.SendEvent(ev);
     }
 }
 public override void Reset()
 {
     base.Reset();
     _eventAttack       = null;
     _remainAttackCount = 0;
 }