protected override ErrorCode doStart(ActionInitParam param) { ActionSpasticityInitParam initParam = param as ActionSpasticityInitParam; spasticityRes = initParam.spasticityRes; spasticityBackswing = uint.MaxValue; return(base.doStart(param)); }
/// <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); }