示例#1
0
    public override void Process()
    {
        switch (m_currentState)
        {
        case EAbilityState.MovingCharacter:
            if (TryToCastAbility(m_targetPos))
            {
            }
            else
            {
                m_attacker.ServerCalculatePath(m_targetPos);
            }
            break;

        case EAbilityState.CastingState:
            ProcessLaunchingTime(ELaunchingState.CastingState);

            m_castingTime -= Time.fixedDeltaTime;
            if (m_castingTime <= 0)
            {
                if (m_ability.AbilityBase.PlayAbilityAnimation)
                {
                    ChangeState(EAbilityState.PlayingAnimation);
                }
                else
                {
                    ChangeState(EAbilityState.AbilityEnds);
                }
            }
            break;

        case EAbilityState.PlayingAnimation:
            m_animationTime -= Time.fixedDeltaTime;
            ProcessLaunchingTime(ELaunchingState.AnimationState);
            if (m_animationTime <= 0)
            {
                ChangeState(EAbilityState.AbilityEnds);
            }
            break;

        case EAbilityState.LaunchProjectileDelayed:
            break;

        default:
            break;
        }
    }
示例#2
0
    public override void Process()
    {
        switch (m_currentState)
        {
        case EAbilityState.MovingCharacter:
            m_updatePathRate -= Time.fixedDeltaTime;
            if (!Target.Dead)
            {
                Node node = Pathfinding.instance.GetNode(m_attacker.Position);
                if (TryToCastAbility(m_targets, m_ability) && (node.walkable || !node.walkable && node.Resident == m_attacker))
                {
                    ;
                }
                else
                {
                    if ((node.walkable || !node.walkable && node.Resident != m_attacker) && !m_ability.IsOnRange(m_attacker, Target.Position))
                    {
                        if (m_updatePathRate <= 0)
                        {
                            if (!node.walkable && node.Resident != m_attacker)
                            {
                                m_attacker.ServerCalculatePath(new Vector2(0, 0));
                                m_updatePathRate = GameDataManager.instance.GlobalConfig.m_targetPathUpdateRate;
                            }
                            else
                            {
                                m_attacker.ServerCalculatePath(Target.Position);
                                m_updatePathRate = GameDataManager.instance.GlobalConfig.m_targetPathUpdateRate;
                            }
                        }
                    }
                    else
                    {
                        if (node.walkable && m_attacker.FollowingPath)
                        {
                            m_attacker.StopAgent(true);
                        }
                    }
                }
            }
            else
            {
                m_attacker.EntityBehaviour.StopAllBehaviours();
            }
            break;

        case EAbilityState.CastingState:
            ProcessLaunchingTime(ELaunchingState.CastingState);

            m_castingTime -= Time.fixedDeltaTime;
            if (m_castingTime <= 0)
            {
                if (m_ability.AbilityBase.PlayAbilityAnimation)
                {
                    ChangeState(EAbilityState.PlayingAnimation);
                }
                else
                {
                    ChangeState(EAbilityState.AbilityEnds);
                }
            }
            break;

        case EAbilityState.PlayingAnimation:
            ProcessLaunchingTime(ELaunchingState.AnimationState);
            if (m_launchParticle == false && m_ability.AbilityBase.LaunchParticleIdentifier != "")
            {
                if (m_launchParticleTime <= 0)
                {
                    m_launchParticle = true;
                    m_attacker.EntityAbilities.RpcSpawnImpactParticle(m_ability.AbilityBase.LaunchParticleIdentifier, (int)m_ability.AbilityBase.LaunchPos);
                }
            }
            m_launchTime         -= Time.fixedDeltaTime;
            m_animationTime      -= Time.fixedDeltaTime;
            m_launchParticleTime -= Time.fixedDeltaTime;
            if (m_launchTime <= 0)
            {
                LaunchAbility();
            }
            if (m_animationTime <= 0)
            {
                ChangeState(EAbilityState.AbilityEnds);
            }
            break;

        case EAbilityState.LaunchProjectileDelayed:
            break;

        default:
            break;
        }
    }
示例#3
0
    public override void Process()
    {
        m_updatePathRate -= Time.fixedDeltaTime;
        m_forcePathRate  -= Time.fixedDeltaTime;
        if (!Target.Dead)
        {
            if (!m_ability.IsOnRange(m_attacker, Target.Position))
            {
                if (m_updatePathRate <= 0)
                {
                    if (m_attacker.LockedNode != null)
                    {
                        m_attacker.LockedNode.Resident = null;
                        m_attacker.LockedNode          = null;
                    }
                    m_attacker.LockedNode = Pathfinding.instance.GeNearestNeighboursInRange(m_attacker, Target.Position, m_ability.Range);
                    m_attacker.ServerCalculatePath(m_attacker.LockedNode.m_position);
                    m_updatePathRate = GameDataManager.instance.GlobalConfig.m_pathUpdateRate;
                }
            }
            else
            {
                if (m_attacker.LockedNode == null)
                {
                    m_attacker.LockedNode = Pathfinding.instance.GeNearestNeighboursInRange(m_attacker, Target.Position, m_ability.Range);
                    m_attacker.ServerCalculatePath(m_attacker.LockedNode.m_position);
                    m_updatePathRate = GameDataManager.instance.GlobalConfig.m_pathUpdateRate;
                }
                if (m_forcePathRate <= 0) //&& Vector2.Distance(m_attacker.Position, Target.Position) < 0.5)
                {
                    if (m_forcePathRate <= 0)
                    {
                        if (m_attacker.LockedNode != null)
                        {
                            m_attacker.LockedNode.Resident = null;
                            m_attacker.LockedNode          = null;
                        }
                        Node currentNode = Pathfinding.instance.GetNode(m_attacker.Position);
                        if (currentNode.Resident == null)
                        {
                            currentNode.Resident  = m_attacker;
                            m_attacker.LockedNode = currentNode;
                            m_attacker.StopAgent(true);
                            m_forcePathRate = GameDataManager.instance.GlobalConfig.m_pathUpdateRate;
                        }
                        else
                        {
                            m_attacker.LockedNode = Pathfinding.instance.GeNearestNeighboursInRange(m_attacker, m_attacker.Position, m_ability.Range);
                            m_attacker.ServerCalculatePath(m_attacker.LockedNode.m_position);
                            m_forcePathRate = GameDataManager.instance.GlobalConfig.m_pathUpdateRate;
                        }
                    }
                }
            }

            if (!m_attacker.FollowingPath)
            {
                if (TryToCastAbility(m_targets, m_ability))
                {
                }
            }
        }
        else
        {
            m_attacker.EntityBehaviour.StopAllBehaviours();
        }
    }