protected override IEnumerator InnerDoGroupAbility(Transform groupTransform) { _toons.transform.position = groupTransform.transform.position + new Vector3(0f, 1f, 0f); _toons.transform.SetParent(groupTransform); GroupAggro groupAggro = groupTransform.GetComponent <GroupAggro>(); groupAggro.SetAggro(float.MaxValue); yield return(new WaitForSeconds(data.ActivatedDuration)); groupAggro.SetAggro(data.AssociatedTactic.GetTactic().GetData().TacticAggro); }
/// <summary> /// Sort players by aggro /// Use aggro as probability /// If a player pass probability test, set as target /// </summary> /// <returns></returns> private bool TryChooseByAggro() { if (GroupAggro.ForcedTargets.Count > 0) { _targetData.SetTarget(GroupAggro.ForcedTargets[Random.Range(0,GroupAggro.ForcedTargets.Count)].GetComponent<GroupManager>().GetRandomImp()); _contextSteering.SetTarget(_targetData); OnBossTargetChanged?.Invoke(_targetData.Target); _currentTargetStillValid = true; return true; } // TODO :- this should be a separate node if(PlayerAggro.ReadAggro() >= Random.Range(1f, 100f)) { _currentTargetStillValid = true; // TODO :- create a player manager, this will lead to errors _targetData.SetTarget(ReincarnationManager.Instance.CurrentLeader.transform); _contextSteering.SetTarget(_targetData); OnBossTargetChanged?.Invoke(_targetData.Target); return true; } GroupAggro selected = null; float probabilitySum = _groupAggros. Where(aggro => aggro.GetComponent<GroupManager>().Imps.Keys.Count > 0 ). Aggregate(0f, (sum, next) => sum + next.CurrentAggro); float diceThrow = Random.Range(1f, probabilitySum); float temp = 0f; List<GroupAggro> _groups = new List<GroupAggro>(); foreach(GroupAggro groupAggro in _groupAggros.Where(aggro => !aggro.GetComponent<GroupManager>().HasNoImps()).OrderByDescending(aggro => aggro.CurrentAggro)) { float groupProbability = groupAggro.CurrentAggro; if(!(diceThrow >= temp && diceThrow <= temp + groupProbability)) { temp += groupProbability; continue; } _groups.Add(groupAggro); break; } if(_groups.Count == 0) return false; selected = _groups .OrderBy(group => Vector3.Distance(group.transform.position, _arenaBoss.Arena.transform.position)) .FirstOrDefault(); if (selected == null) return false; _currentTargetStillValid = true; _targetData.SetTarget(selected.GetComponent<GroupManager>().GetRandomImp()); _contextSteering.SetTarget(_targetData); OnBossTargetChanged?.Invoke(_targetData.Target); return true; }