public virtual void InitializeAI() { T entity = GetEntity(); entity.HasBrain = true; Navigator = GetComponent <BaseNavigator>(); if (UseAIDesign) { AIDesign = new AIDesign(); AIDesign.SetAvailableStates(GetStateList()); if (Events == null) { Events = new AIEvents(); } bool senseFriendlies = MaxGroupSize > 0; Senses.Init(entity, SenseRange, TargetLostRange, VisionCone, CheckVisionCone, CheckLOS, IgnoreNonVisionSneakers, ListenRange, HostileTargetsOnly, senseFriendlies, IgnoreSafeZonePlayers, SenseTypes); if (DefaultDesignSO == null) { Debug.LogWarning("Brain on " + base.gameObject.name + " is trying to load a null AI design!"); return; } Events.Memory.Position.Set(base.transform.position, 4); LoadAIDesign(AIDesigns.GetByNameOrInstance(DefaultDesignSO.Filename, InstanceSpecificDesign), null); AIInformationZone forPoint = AIInformationZone.GetForPoint(base.transform.position, false); if (forPoint != null) { forPoint.RegisterSleepableEntity(this); } } BaseEntity.Query.Server.AddBrain(entity); StartMovementTick(); }
private bool TestFleeDirection(BaseNavigator navigator, Vector3 dirFromThreat, float offsetDegrees, float minRange, float maxRange, out Vector3 result) { result = navigator.transform.position; Vector3 vector = Quaternion.Euler(0f, offsetDegrees, 0f) * dirFromThreat; Vector3 target = navigator.transform.position + vector * UnityEngine.Random.Range(minRange, maxRange); Vector3 position; if (!navigator.GetNearestNavmeshPosition(target, out position, 20f)) { return(false); } if (!navigator.IsAcceptableWaterDepth(position)) { return(false); } result = position; return(true); }
public virtual bool GetBestFleePosition(BaseNavigator navigator, AIBrainSenses senses, BaseEntity fleeFrom, Vector3 fallbackPos, float minRange, float maxRange, out Vector3 result) { if (fleeFrom == null) { result = navigator.transform.position; return(false); } Vector3 dirFromThreat = Vector3Ex.Direction2D(navigator.transform.position, fleeFrom.transform.position); if (TestFleeDirection(navigator, dirFromThreat, 0f, minRange, maxRange, out result)) { return(true); } bool flag = UnityEngine.Random.Range(0, 2) == 1; if (TestFleeDirection(navigator, dirFromThreat, flag ? 45f : 315f, minRange, maxRange, out result)) { return(true); } if (TestFleeDirection(navigator, dirFromThreat, flag ? 315f : 45f, minRange, maxRange, out result)) { return(true); } if (TestFleeDirection(navigator, dirFromThreat, flag ? 90f : 270f, minRange, maxRange, out result)) { return(true); } if (TestFleeDirection(navigator, dirFromThreat, flag ? 270f : 90f, minRange, maxRange, out result)) { return(true); } if (TestFleeDirection(navigator, dirFromThreat, 135f + UnityEngine.Random.Range(0f, 90f), minRange, maxRange, out result)) { return(true); } return(false); }
public virtual Vector3 GetBestRoamPosition(BaseNavigator navigator, Vector3 fallbackPos, float minRange, float maxRange) { float radius = UnityEngine.Random.Range(minRange, maxRange); int num = 0; int num2 = 0; float num3 = UnityEngine.Random.Range(0f, 90f); for (float num4 = 0f; num4 < 360f; num4 += 90f) { Vector3 pointOnCircle = GetPointOnCircle(navigator.transform.position, radius, num4 + num3); Vector3 position; if (navigator.GetNearestNavmeshPosition(pointOnCircle, out position, 10f) && navigator.IsAcceptableWaterDepth(position)) { topologySamples[num] = position; num++; if (navigator.IsPositionATopologyPreference(position)) { preferedTopologySamples[num2] = position; num2++; } } } if (UnityEngine.Random.Range(0f, 1f) <= 0.9f && num2 > 0) { chosenPosition = preferedTopologySamples[UnityEngine.Random.Range(0, num2)]; } else if (num > 0) { chosenPosition = topologySamples[UnityEngine.Random.Range(0, num)]; } else { chosenPosition = fallbackPos; } return(chosenPosition); }