protected override ErrorCode doStart(ActionInitParam param)
    {
        ErrorCode err = base.doStart(param);

        if (err != ErrorCode.Succeeded)
        {
            return(err);
        }

        ActionDisplacementInitParam displacementInit = param as ActionDisplacementInitParam;

        mDisplacementResource = displacementInit.displacementResource;

        if (mDisplacementResource.leagueSelectionOnExecute != LeagueSelection.None &&
            mDisplacementResource.skillEffect2OthersOnExecute != uint.MaxValue)
        {
            mTargetSelectionOnExecute = new TargetSelectionTableItem()
            {
                resID          = -1,
                desc           = "displacement hit",
                leagueSel      = mDisplacementResource.leagueSelectionOnExecute,
                maxTargetCount = uint.MaxValue,
                shape          = ShapeType.ShapeType_Rect,
                RectLength     = mDisplacementResource.radiusOnCollide * 2
            }
        }
        ;

        return(ErrorCode.Succeeded);
    }
Example #2
0
    /// <summary>
    /// 开始位移.
    /// </summary>
    /// <param name="actionCenter">动作控制器</param>
    /// <param name="attackerAttr">发起这次位移的单位的属性(如果是突进, 那么是角色本身; 如果是击退, 为发起击退技能的单位)</param>
    /// <param name="displacementRes"></param>
    /// <returns></returns>
    public static ErrorCode StartDisplace(BattleUnitActionCenter actionCenter, AttackerAttr attackerAttr, uint displacementResID)
    {
        SkillDisplacementTableItem displacementRes = DataManager.DisplacementTable[displacementResID] as SkillDisplacementTableItem;

        if (displacementRes == null)
        {
            SkillUtilities.ResourceNotFound("displacement", displacementResID);
            return(ErrorCode.ConfigError);
        }

        // 免疫控制(有害的位移, 都视为控制).
        if (!actionCenter.Owner.CanBeStuned() && displacementRes.harmful)
        {
            return(ErrorCode.AddEffectFailedSkillEffectImmunity);
        }

        if ((actionCenter.GetActionByType(ActionTypeDef.ActionTypeDisplacement) as ActionDisplacement) != null)
        {
            return(ErrorCode.MaxStackCount);
        }

        Vector3 ownerPosition  = actionCenter.Owner.GetPosition();
        Vector3 targetPosition = ownerPosition;

        float distance = displacementRes.distance;

        if (distance < 0)
        {
            return(ErrorCode.ConfigError);
        }

        Vector3 displaceDirection = Vector3.zero;

        // 确定方向.
        switch (displacementRes.displacementType)
        {
        case SkillDisplacementType.Rush:
            displaceDirection = Utility.RadianToVector3(actionCenter.Owner.GetDirection());
            break;

        case SkillDisplacementType.Beatback:
            displaceDirection = Utility.RadianToVector3(attackerAttr.EffectStartDirection);
            break;

        default:
            return(ErrorCode.ConfigError);
        }

        displaceDirection.y = 0;

        // 速度为负, 取反方向.
        if (displacementRes.speed < 0f)
        {
            displaceDirection = Vector3.zero - displaceDirection;
        }

        // beatback时, 特殊处理距离与朝向.
        if (displacementRes.displacementType == SkillDisplacementType.Beatback)
        {
            // 击退, 且速度为负时, 表示牵引向目标点.
            if (displacementRes.speed < 0f)
            {
                float magnitude = displaceDirection.magnitude;
                // 牵引的位置不会超过目标点的位置, 且与目标点的位置至少为0.5f.
                if (magnitude < distance)
                {
                    distance = Mathf.Max(0f, magnitude - 0.5f);
                }
            }
            else                // 击退时, 面朝起始点方向(后仰).
            {
                actionCenter.Owner.SetDirection(Utility.Vector3ToRadian(displaceDirection) + Mathf.PI);
            }
        }

        displaceDirection.Normalize();
        displaceDirection *= distance;
        targetPosition    += displaceDirection;

        BaseScene scn = SceneManager.Instance.GetCurScene();

        if (scn == null)
        {
            return(ErrorCode.LogicError);
        }

        targetPosition = scn.FarthestWalkable(ownerPosition, targetPosition);

        ActionDisplacementInitParam param = new ActionDisplacementInitParam();

        param.targetPosition       = targetPosition;
        param.displacementResource = displacementRes;
        param.mAttackerAttr        = attackerAttr;

        return(actionCenter.StartAction(param));
    }