private int SetRecoveryAndGetOverRecovery(int _value, UnitCtrl _source, BasePartsData _target, bool _isMagic) { eInhibitHealType eInhibit = _isMagic ? eInhibitHealType.MAGIC : eInhibitHealType.PHYSICS; SetRecovery(_value, eInhibit, _source, true, false, false, false, true, _target); return((int)(Hp + _value - BaseValues.Hp)); }
public virtual void Initialize(BasePartsData _target, List <ActionParameter> _actions, Skill _skill, List <NormalSkillEffect> _skillEffect, UnitCtrl _owner, float _height, bool _hasBlackOutTime, bool _isAbsolute, Vector3 _targetPosition, List <ShakeEffect> _shakes, eTargetBone _targetBone) { ShakeEffects = _shakes; IsAbsolute = _isAbsolute; Skill = _skill; Vector3 pos = _targetPosition; if (!IsAbsolute) { if (_targetBone == eTargetBone.FIXED_CENETER || _targetBone == eTargetBone.CENTER) { pos = _target.GetButtontransformPosition() + _target.GetFixedCenterPos(); } if (_targetBone == eTargetBone.BOTTOM) { pos = _target.GetButtontransformPosition(); } if (_targetBone == eTargetBone.HEAD) { pos = GetHeadBonePos(_target); } } TargetPos = pos; FireTarget = _target; _target.Owner.FirearmCtrlsOnMe.Add(this); SkillHitEffects = _skillEffect; EndActions = _actions; owner = _owner; SetInitialPosition(); InitMoveType(_height, _owner); float distance = Vector3.Distance(TargetPos, initialPosistion) + 1; owner.StartCoroutine(UpdatePosition(distance)); }
public void ExecChildrenAction(ActionParameter action, Skill skill, BasePartsData target, int num, float starttime, Dictionary <int, bool> enabledChildAction) { foreach (int idx in action.ActionChildrenIndexes) { ActionParameter childAction = skill.ActionParmeters[idx]; if (childAction.ActionType != eActionType.MODE_CHANGE || childAction.ActionDetail1 != 3) { if (!enabledChildAction.ContainsKey(childAction.ActionId) || enabledChildAction[childAction.ActionId]) { if (action.ActionType != eActionType.ATTACK || action.ExecTime.Length - 1 == num) { //简化调用协程的流程 StartCoroutine(ExecActionWithDelayAndTarget(childAction, skill, target, starttime, false, true, false)); } } } } }
//UnitActionController__createNormalEffectPrefab调用 public virtual void SetPossitionAppearanceType(NormalSkillEffect skillEffect, BasePartsData target, UnitCtrl _owner, Skill skill) { }
public void SetRecovery(int _value, eInhibitHealType _inhibitHealType, UnitCtrl _source, bool _isEffect = true, bool _isRevival = false, bool _isUnionBurstLifeSteal = false, bool _isRegenerate = false, bool _useNumberEffect = true, BasePartsData _target = null) { if (_target == null) { _target = GetFirstParts(true, 0); } if ((isDead || Hp <= 0) && !_isRevival) { Debug.LogError("治疗无效,目标已经死了!"); } else { if (_inhibitHealType != eInhibitHealType.NO_EFFECT && IsAbnormalState(eAbnormalState.INHIBIT_HEAL)) { if (GetAbnormalStateMainValue(eAbnormalStateCategory.INHIBIT_HEAL) != 0) { DamageData damageData_0 = new DamageData(); damageData_0.Target = GetFirstParts(this != null, 0); damageData_0.Damage = Mathf.FloorToInt(GetAbnormalStateMainValue(eAbnormalStateCategory.INHIBIT_HEAL) * _value); damageData_0.DamageType = eDamageType.NONE; AbnormalStateCategoryData abdata = abnormalStateCategoryDataDictionary[eAbnormalStateCategory.INHIBIT_HEAL]; damageData_0.Source = abdata.Source; damageData_0.DamageNumMagic = _inhibitHealType == eInhibitHealType.MAGIC; damageData_0.ActionType = eActionType.INHIBIT_HEAL; SetDamage(damageData_0, false, abdata.ActionId, null, true, abdata.Skill, true, null, false, 1, 1, null); } } else { Hp += _value; //AppendbattleLog; if (Hp > BaseValues.Hp) { Hp = BaseValues.Hp; } unitUI.SetHP(Hp / BaseValues.Hp); string msg = UnitName + "恢复<color=#00FF00>" + _value + "</color>生命"; BattleUIManager.Instance.LogMessage(msg, eLogMessageType.HP_RECOVERY, IsOther); if (_isUnionBurstLifeSteal) { unionburstLifeStealNum += _value; } else { if (_useNumberEffect) { //特效数字 } if (_isEffect) { //治疗特效 } } } } }
/// <summary> /// 判断目标是否在范围内(未完成) /// </summary> /// <param name="actionParameter"></param> /// <param name="basePosition">FIXEDPOSITION</param> /// <param name="considerbodywidth"></param> /// <param name="parentLossyScale"></param> /// <param name="start"></param> /// <param name="end"></param> /// <param name="unitCtrl"></param> /// <returns></returns> private bool JudgeIsInTargetArea(ActionParameter actionParameter, Vector3 basePosition, bool considerbodywidth, float parentLossyScale, float start, float end, BasePartsData unitCtrl) { if (!unitCtrl.GetTargetable()) { return(false); } float distance = Mathf.Abs((unitCtrl.GetPosition().x - basePosition.x) / parentLossyScale); float dis2 = unitCtrl.GetBodyWidth(); if (considerbodywidth) { dis2 += Owner.BodyWidth; } if (distance >= start - 0.5f * dis2 && distance <= dis2 * 0.5f + end) { return(true); } return(actionParameter.Direction == DirectionType.ALL); }
/// <summary> /// 按有限度要求对目标列表进行排序 /// </summary> /// <param name="actionParameter"></param> /// <param name="baaseTransform"></param> /// <param name="value"></param> /// <param name="quiet"></param> private void SortTargetListByTargetPattern(ActionParameter actionParameter, Transform baaseTransform, float value, bool quiet) { List <BasePartsData> targetList = actionParameter.TargetList; SortFunction sort = (a, b) => a.GetButtontransformPosition().x > b.GetButtontransformPosition().x ? 1 : (a.GetButtontransformPosition().x < b.GetButtontransformPosition().x ?-1:0); switch (actionParameter.TargetSort) { case PirorityPattern.RANDOM: case PirorityPattern.RANDOM_ONCE: case PirorityPattern.ALL_SUMMON_RANDOM: case PirorityPattern.OWN_SUMMON_RANDOM: if (targetList.Count >= 2) { for (int i = targetList.Count - 1; i > 0; i--) { int random = staticBattleManager.Random(0, i); BasePartsData a = targetList[random]; BasePartsData b = targetList[i]; targetList[random] = b; targetList[i] = a; } } return; case PirorityPattern.NEAR: sort = (a, b) => a.GetButtontransformPosition().x > b.GetButtontransformPosition().x ? 1 : (a.GetButtontransformPosition().x < b.GetButtontransformPosition().x ? -1 : 0); break; case PirorityPattern.FAR: sort = (a, b) => a.GetButtontransformPosition().x < b.GetButtontransformPosition().x ? 1 : (a.GetButtontransformPosition().x > b.GetButtontransformPosition().x ? -1 : 0); break; case PirorityPattern.HP_ASC: sort = ((a, b) => a.Owner.Hp > b.Owner.Hp ? 1 : (a.Owner.Hp < b.Owner.Hp ? -1 : 0)); break; case PirorityPattern.HP_DEC: sort = ((a, b) => a.Owner.Hp < b.Owner.Hp ? 1 : (a.Owner.Hp > b.Owner.Hp ? -1 : 0)); break; case PirorityPattern.OWNER: targetList.Clear(); targetList.Add(Owner.GetFirstParts(Owner, -1024)); return; case PirorityPattern.FORWARD: case PirorityPattern.BACK: if ((actionParameter.TargetSort == PirorityPattern.FORWARD ^ Owner.IsOther) ^ Owner.IsConfusionOrConvert) { sort = ((a, b) => a.Owner.FixedPosition.x < b.Owner.FixedPosition.x ? 1 : (a.Owner.FixedPosition.x > b.Owner.FixedPosition.x ? -1 :0)); } else { sort = ((a, b) => a.Owner.FixedPosition.x > b.Owner.FixedPosition.x ? 1 : (a.Owner.FixedPosition.x < b.Owner.FixedPosition.x ? -1 : 0)); } break; case PirorityPattern.ABSOLUTE_POSITION: targetList.Clear(); targetList.Add(Owner.GetFirstParts(true, 0)); return; case PirorityPattern.ENERGY_DEC_NEAR: case PirorityPattern.ENERGY_DEC: sort = ((a, b) => a.Owner.Energy < b.Owner.Energy ? 1 : (a.Owner.Energy > b.Owner.Energy ? -1 :0)); QuichSortTargetList(targetList, sort); List <BasePartsData> full = new List <BasePartsData>(); List <BasePartsData> notfull = new List <BasePartsData>(); foreach (BasePartsData a in targetList) { if (a.Owner.Energy == 1000) { full.Add(a); } else { notfull.Add(a); } } notfull.AddRange(full); targetList = notfull; return; case PirorityPattern.ENERGY_REDUCING: case PirorityPattern.ENERGY_ASC: sort = ((a, b) => a.Owner.Energy > b.Owner.Energy ? 1 : (a.Owner.Energy < b.Owner.Energy ? -1 : 0)); break; case PirorityPattern.ATK_DEC: sort = ((a, b) => a.Owner.BaseValues.Atk < b.Owner.BaseValues.Atk ? 1 : (a.Owner.BaseValues.Atk > b.Owner.BaseValues.Atk ? -1:0)); break; case PirorityPattern.ATK_ASC: sort = ((a, b) => a.Owner.BaseValues.Atk > b.Owner.BaseValues.Atk ? 1 : (a.Owner.BaseValues.Atk < b.Owner.BaseValues.Atk ? -1 : 0)); break; case PirorityPattern.MAGIC_STR_DEC: sort = ((a, b) => a.Owner.BaseValues.Magic_str < b.Owner.BaseValues.Magic_str ? 1 : (a.Owner.BaseValues.Magic_str > b.Owner.BaseValues.Magic_str ?-1:0)); break; case PirorityPattern.MAGIC_STR_ASC: sort = ((a, b) => a.Owner.BaseValues.Magic_str > b.Owner.BaseValues.Magic_str ? 1 : (a.Owner.BaseValues.Magic_str < b.Owner.BaseValues.Magic_str ? -1:0)); break; case PirorityPattern.BOSS: Debug.LogError("以BOSS为优先度的排序鸽了!"); return; case PirorityPattern.HP_ASC_NEAR: sort = ((a, b) => a.Owner.Hp > b.Owner.Hp ? 1 : (a.Owner.Hp < b.Owner.Hp ? -1 : 0)); Debug.LogError("该排序暂时不考虑距离!"); break; case PirorityPattern.HP_DEC_NEAR: sort = ((a, b) => a.Owner.Hp < b.Owner.Hp ? 1 : (a.Owner.Hp > b.Owner.Hp ? -1 : 0)); break; case PirorityPattern.MAGIC_STR_DEC_NEAR: sort = ((a, b) => a.Owner.BaseValues.Magic_str < b.Owner.BaseValues.Magic_str ? 1 : (a.Owner.BaseValues.Magic_str > b.Owner.BaseValues.Magic_str ? -1 : 0)); Debug.LogError("该排序暂时不考虑距离!"); break; case PirorityPattern.SHADOW: Debug.LogError("以SHADOW为优先度的排序鸽了!"); return; case PirorityPattern.ATK_MAGIC: //也就新年u1有这个还是群体,不排序也无所谓 break; default: //sort = ((a, b) => a.GetButtontransformPosition().x < b.GetButtontransformPosition().x ? 1 : -1); //Debug.LogError("以" + actionParameter.TargetSort.ToString() + "为优先度的排序鸽了!"); break; } QuichSortTargetList(targetList, sort); }
/// <summary> /// 搜索目标单位(根据技能的assisment,area,range,考虑召唤物类型的sort),添加所有符合条件的战斗单位为目标) /// </summary> /// <param name="actionParameter"></param> /// <param name="basePosition"></param> /// <param name="skill"></param> /// <param name="considerBodyWidth"></param> private void SearchTargetUnit(ActionParameter actionParameter, Vector3 basePosition, Skill skill, bool considerBodyWidth) { actionParameter.TargetList.Clear(); List <UnitCtrl> targetEnemyList = (Owner.IsOther ^ Owner.IsConfusionOrConvert) ? staticBattleManager.PlayersList : staticBattleManager.EnemiesList; List <UnitCtrl> targetPlayetList = Owner.IsOther ? staticBattleManager.EnemiesList : staticBattleManager.PlayersList; List <UnitCtrl> targetList_default; if (actionParameter.TargetAssignment == eTargetAssignment.OTHER_SIDE) { targetList_default = targetEnemyList; } else { targetList_default = targetPlayetList; } //根据优先度先筛选一部分目标 switch (actionParameter.TargetSort) { case PirorityPattern.ALL_SUMMON_RANDOM: case PirorityPattern.SUMMON: targetList_default = targetList_default.FindAll(a => a.SummonType == eSummonType.SUMMON || a.SummonType == eSummonType.PHANTOM); break; case PirorityPattern.ATK_PHYSICS: targetList_default = targetList_default.FindAll(a => a.AtkType == 1); break; case PirorityPattern.ATK_MAGIC: targetList_default = targetList_default.FindAll(a => a.AtkType == 2); break; case PirorityPattern.OWN_SUMMON_RANDOM: targetList_default.Clear(); foreach (UnitCtrl unitCtrl in Owner.SummonUnitDictionary.Values) { targetList_default.Add(unitCtrl); } targetList_default = targetList_default.FindAll(a => !(a.IdleOnly || a.IsDead)); break; default: break; } if (actionParameter.TargetSort == PirorityPattern.FORWARD || actionParameter.TargetSort == PirorityPattern.BACK) { foreach (UnitCtrl unit in targetList_default) { if (JudgeIsTarget(unit, actionParameter)) { if (unit.IsPartsBoss) { Debug.LogError("咕咕咕!"); } else { actionParameter.TargetList.Add(unit.GetFirstParts(false, 0)); } } } return; } bool dir = actionParameter.Direction == DirectionType.FRONT ? !Owner.IsLeftDir : false; float searchTargetWidth = actionParameter.TargetWidth; if (searchTargetWidth <= 0) { if (skill.SkillId == 1) { searchTargetWidth = Owner.SearchAreaWidth; } else { searchTargetWidth = skill.skillAreaWidth; } } float start = dir ? 0 : -1 * searchTargetWidth; BasePartsData item = null; foreach (UnitCtrl unit1 in targetList_default) { if (unit1.IsPartsBoss) { Debug.LogError("咕咕咕!"); } else { if (JudgeIsInTargetArea(actionParameter, basePosition, considerBodyWidth, 1, start, actionParameter.TargetWidth, unit1.GetFirstParts(false, 0))) { if (JudgeIsTarget(unit1, actionParameter)) { actionParameter.TargetList.Add(unit1.GetFirstParts(false, 0)); } else { if (unit1.Hp > 0) { item = unit1.GetFirstParts(false, 0); } } } } } if (actionParameter.TargetSort == PirorityPattern.NEAR) { if (item != null && actionParameter.TargetList.Count == 0) { if (!Owner.IsConfusionOrConvert) { actionParameter.TargetList.Add(item); } } } }
private void SearchAndSortTarget(Skill skill, ActionParameter action, Vector3 basePosition, bool quiet, bool considerBodyWidth) { SearchTargetUnit(action, basePosition, skill, considerBodyWidth); SortTargetListByTargetPattern(action, Owner.transform, action.Value[1], false); int v19 = 0; int i; for (i = 0; ; i = 1) { if (v19 >= action.TargetList.Count - action.TargetNth) { break; } action.TargetList[v19] = action.TargetList[action.TargetNth + v19]; v19++; } if (i == 1) { int v28 = action.TargetList.Count; for (int j = v28; j > v28 - action.TargetNth; j--) { action.TargetList.RemoveAt(j - 1);//移除重复目标 } } else { if (action.TargetNth > 0) { if (action.TargetList.Count > 0)//如果目标数量小于最小优先度,选取最接近的目标代替 { BasePartsData target = action.TargetList[action.TargetList.Count - 1]; action.TargetList.Clear(); action.TargetList.Add(target); } } } /*if(action.TargetAssignment == eTargetAssignment.OWNER_SIDE && action.TargetNum == 1&&action.TargetList.Count>0) * {//在ExecUnitActionWithDelay里会判定目标数量 * BasePartsData target = action.TargetList[0]; * action.TargetList.Clear(); * action.TargetList.Add(target); * }*/ //如果不是对敌方的单目标技能,结束 if (action.TargetAssignment != eTargetAssignment.OTHER_SIDE || action.TargetNum != 1) { action.isSearchAndSorted = true; return; } //对于对敌单目标技能,判断距离 if (action.TargetList.Count > 1) { BasePartsData target = action.TargetList[0]; action.TargetList.Clear(); action.TargetList.Add(target); } /*if (!Owner.IsOther) * { * if (Owner.IsConfusionOrConvert) * { * // * } * }*/ action.isSearchAndSorted = true; }
public void ExecAction(ActionParameter action, Skill skill, BasePartsData target, int num, float starttime) { //int index = skill.ActionParmeters.FindIndex(a => a == action)+1; //int index2 = skill.ActionParmeters.Count; //string loging = Owner.UnitName + "执行技能" + skill.SkillName + "(" + index + "/" + index2 + ")" // + ",目标" + target.Owner.UnitName; //Debug.Log(loging); //BattleUIManager.Instance.LogMessage(loging, Owner.IsOther); Dictionary <int, float> valueDic = new Dictionary <int, float> { { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 } }; for (int i = 1; i < 8; i++) { float addValue = 0; float multValue = 1; float divVale = 1; if (action.AdditionalValue.TryGetValue(i, out float add)) { addValue = add; } if (action.MultipleValue.TryGetValue(i, out float mult)) { multValue = mult; } if (action.DivideValue.TryGetValue(i, out float div)) { divVale = div == 0 ? 1 : div; } valueDic[i] = (((action.Value.TryGetValue(i, out float value)?value:0) + addValue) * multValue) / divVale; } bool v52 = action.JudgeLastAndNotExeced(target.Owner, num); int v34 = action.AlreadyExecedData[target.Owner][num].TargetPartsNumber; Dictionary <int, bool> enabledChildaction = new Dictionary <int, bool>(); if (!target.ResistStatus(action.ActionType, action.ActionDetail1, this.Owner, v52, v34 == 1, target)) { if (action.JudgeIsAlreadyExeced(target.Owner, num)) { //暂时忽略子技能 action.ExecAction(Owner, target, num, this, skill, 0, enabledChildaction, valueDic); } } if (action.ActionType != eActionType.REFLEXIVE) { if (action.HitOnceDic.ContainsKey(target)) { if (action.ExecTime.Length - 1 != num) { return;//技能还没执行完毕,返回 } if (!action.HitOnceDic[target]) { foreach (int i in action.ActionChildrenIndexes) { skill.ActionParmeters[action.ActionChildrenIndexes[i]].OnActionEnd?.Invoke(); } return; } } ExecChildrenAction(action, skill, target, num, starttime, enabledChildaction); } }
protected virtual Vector3 GetHeadBonePos(BasePartsData _target) { return(_target.GetButtontransformPosition() + _target.GetFixedCenterPos()); }