Пример #1
0
    protected override ErrorCode doStart(ActionInitParam param)
    {
        ActionSpasticityInitParam initParam = param as ActionSpasticityInitParam;

        spasticityRes       = initParam.spasticityRes;
        spasticityBackswing = uint.MaxValue;
        return(base.doStart(param));
    }
Пример #2
0
    /// <summary>
    /// 开始硬直.
    /// </summary>
    public static ErrorCode StartSpasticity(BattleUnitActionCenter actionCenter,
                                            AttackerAttr attackerAttr,
                                            uint spasticityResID,
                                            ref uint cdMilliseconds
                                            )
    {
        if (cdMilliseconds != 0)
        {
            return(ErrorCode.CoolingDown);
        }

        // 无法被控制.
        if (!actionCenter.Owner.CanBeStuned())
        {
            return(ErrorCode.AddEffectFailedSkillEffectImmunity);
        }

        // 硬直抗性.
        int resistance = actionCenter.Owner.GetPropertyValue((int)PropertyTypeEnum.PropertyTypeSpasticityResistance);

        // 硬直抗性不低于抗性最大值, 无法触发硬直.
        if (resistance >= GameConfig.MaxSpasticityResistance)
        {
            return(ErrorCode.AddEffectFailedSkillEffectImmunity);
        }

        SkillSpasticityTableItem spasticityRes = DataManager.SkillSpasticityTable[spasticityResID] as SkillSpasticityTableItem;

        if (spasticityRes == null)
        {
            SkillUtilities.ResourceNotFound("skillspasticity", spasticityResID);
            return(ErrorCode.ConfigError);
        }

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

        Vector3 spasticityDirection = Utility.RadianToVector3(attackerAttr.EffectStartDirection);

        spasticityDirection.y = 0;

        // 被硬直的单位的朝向为硬直位移方向的反方向.
        actionCenter.Owner.SetDirection(Utility.Vector3ToRadian(spasticityDirection) + Mathf.PI);

        // 计算硬直位移的距离.
        float distance = spasticityRes.distance;

        // 如果硬直抗性低于默认值, 击退距离 *= (100 / 抗性).
        if (resistance > 100)
        {
            resistance *= (100 / resistance);
        }

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

        BaseScene scn = SceneManager.Instance.GetCurScene();

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

        // 检测场景阻挡, 确定终点位置.
        targetPosition = scn.FarthestWalkable(ownerPosition, targetPosition);

        ActionSpasticityInitParam param = new ActionSpasticityInitParam();

        param.spasticityRes  = spasticityRes;
        param.targetPosition = targetPosition;
        param.mAttackerAttr  = attackerAttr;

        // 当前的硬直动作.
        ActionSpasticity spasticityAction = actionCenter.GetActionByType(ActionTypeDef.ActionTypeSpasticity) as ActionSpasticity;

        ErrorCode err = ErrorCode.Succeeded;

        // 重新开始硬直.
        err = (spasticityAction != null) ? spasticityAction.Restart(param) : actionCenter.StartAction(param);

        if (err == ErrorCode.Succeeded)
        {
            // 硬直抗性, 可以用来增加硬直的CD时间.
            cdMilliseconds = (uint)(param.spasticityRes.cdMilliseconds * resistance / 100f);
        }

        return(err);
    }