public void Hear(ref GeneratedAlert alert) { for (int i = 0; i < _listeners.Length; i++) { _listeners[i].OnAlert(ref alert); } }
/// <summary> /// Registers an alert. Flees if hostile and is told to do so. /// </summary> public void OnAlert(GeneratedAlert alert) { if (alert.IsHostile && FleeOnHostileAlerts && isActiveAndEnabled) { flee(); } }
/// <summary> /// Registers a new alert and returns its ID. /// </summary> public static void Broadcast(Vector3 position, float range, bool isHostile, Actor actor, bool isDirect) { var alert = new GeneratedAlert(position, range, isHostile, actor, isDirect); var count = Physics.OverlapSphereNonAlloc(position, range, _colliders, 0x1, QueryTriggerInteraction.Ignore); for (int i = 0; i < count; i++) { var listener = AIListeners.Get(_colliders[i].gameObject); if (listener != null && listener.isActiveAndEnabled && Vector3.Distance(listener.transform.position, position) < range * listener.Hearing) { listener.SendMessage("OnAlert", alert, SendMessageOptions.DontRequireReceiver); } } }
/// <summary> /// Broadcasts an alert to all AIListener components in the area surrounding it. /// </summary> public static void Broadcast(Vector3 position, float range, bool isHostile, Actor actor, bool isDirect) { if (range <= float.Epsilon) { return; } var alert = new GeneratedAlert(position, range, isHostile, actor, isDirect); var count = Physics.OverlapSphereNonAlloc(position, range, Util.Colliders, Layers.Character, QueryTriggerInteraction.Ignore); for (int i = 0; i < count; i++) { var listener = AIListeners.Get(Util.Colliders[i].gameObject); if (listener != null && listener.isActiveAndEnabled && Vector3.Distance(listener.transform.position, position) < range * listener.Hearing) { listener.Hear(ref alert); } } }
/// <summary> /// Notified by an alert system of an alert. /// </summary> public void OnAlert(GeneratedAlert alert) { if (alert.Actor != null && alert.Actor.Side != Actor.Side) { if (Threat == null) { SetUnseenThreat(alert.IsDirect, alert.Actor, alert.Position, null); } else if (alert.Actor == Threat && !CanSeeTheThreat) { SetUnseenThreat(alert.IsDirect, alert.Actor, alert.Position, Threat.Cover); } else if (Time.timeSinceLevelLoad - LastSeenThreatTime > 3) { SetUnseenThreat(alert.IsDirect, alert.Actor, alert.Position, alert.IsDirect ? alert.Actor.Cover : null); } if (!alert.IsHostile && !IsScared && !IsAlerted) { setState(CivilianState.follow); } } }
/// <summary> /// Registers a new alert and returns its ID. /// </summary> public static int Register(Vector3 position, float range) { _alerts[++_latest] = new GeneratedAlert(position, range); return(_latest); }