Ejemplo n.º 1
0
    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();
    }
Ejemplo n.º 2
0
    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);
    }
Ejemplo n.º 3
0
    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);
    }
Ejemplo n.º 4
0
    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);
    }