示例#1
0
 private void AddCoverPoint(AICoverPoint point)
 {
     if (!coverPoints.Contains(point))
     {
         coverPoints.Add(point);
         MarkDirty();
     }
 }
示例#2
0
 public override void StateLeave()
 {
     base.StateLeave();
     GetEntity().SetDucked(false);
     GetEntity().ClearStationaryAimPoint();
     if ((bool)currentCover)
     {
         currentCover.ClearIfUsedBy(GetEntity());
         currentCover = null;
     }
 }
示例#3
0
 public override void StateEnter()
 {
     GetEntity().SetDesiredSpeed(HumanNPC.SpeedType.Walk);
     lastCoverTime = -10f;
     isFleeing     = false;
     inCover       = false;
     timeInCover   = -1f;
     GetEntity().ClearStationaryAimPoint();
     currentCover = null;
     base.StateEnter();
 }
示例#4
0
    public AICoverPoint GetBestCoverPoint(
        Vector3 currentPosition,
        Vector3 hideFromPosition,
        float minRange       = 0.0f,
        float maxRange       = 20f,
        BaseEntity forObject = null)
    {
        AICoverPoint aiCoverPoint = (AICoverPoint)null;
        float        num1         = 0.0f;

        foreach (AICoverPoint coverPoint in this.coverPoints)
        {
            if (!coverPoint.InUse() || coverPoint.IsUsedBy(forObject))
            {
                Vector3 position   = ((Component)coverPoint).get_transform().get_position();
                Vector3 vector3    = Vector3.op_Subtraction(hideFromPosition, position);
                Vector3 normalized = ((Vector3) ref vector3).get_normalized();
                float   num2       = Vector3.Dot(((Component)coverPoint).get_transform().get_forward(), normalized);
                if ((double)num2 >= 1.0 - (double)coverPoint.coverDot)
                {
                    float num3 = Vector3.Distance(currentPosition, position);
                    float num4 = 0.0f;
                    if ((double)minRange > 0.0)
                    {
                        num4 -= (float)((1.0 - (double)Mathf.InverseLerp(0.0f, minRange, num3)) * 100.0);
                    }
                    float num5 = Mathf.Abs((float)(position.y - currentPosition.y));
                    float num6 = num4 + (float)((1.0 - (double)Mathf.InverseLerp(1f, 5f, num5)) * 500.0) + Mathf.InverseLerp(1f - coverPoint.coverDot, 1f, num2) * 50f + (float)((1.0 - (double)Mathf.InverseLerp(2f, maxRange, num3)) * 100.0);
                    float num7 = 1f - Mathf.InverseLerp(4f, 10f, Vector3.Distance(currentPosition, hideFromPosition));
                    vector3 = Vector3.op_Subtraction(((Component)coverPoint).get_transform().get_position(), currentPosition);
                    float num8 = Vector3.Dot(((Vector3) ref vector3).get_normalized(), normalized);
                    float num9 = num6 - Mathf.InverseLerp(-1f, 0.25f, num8) * 50f * num7;
                    if ((double)num9 > (double)num1)
                    {
                        aiCoverPoint = coverPoint;
                        num1         = num9;
                    }
                }
            }
        }
        if (Object.op_Implicit((Object)aiCoverPoint))
        {
            return(aiCoverPoint);
        }
        return((AICoverPoint)null);
    }
    public AICoverPoint GetBestCoverPoint(Vector3 currentPosition, Vector3 hideFromPosition, float minRange = 0f, float maxRange = 20f, BaseEntity forObject = null)
    {
        AICoverPoint aICoverPoint = null;
        float        single       = 0f;

        foreach (AICoverPoint coverPoint in this.coverPoints)
        {
            if (coverPoint.InUse() && !coverPoint.IsUsedBy(forObject))
            {
                continue;
            }
            Vector3 vector3  = coverPoint.transform.position;
            Vector3 vector31 = hideFromPosition - vector3;
            Vector3 vector32 = vector31.normalized;
            float   single1  = Vector3.Dot(coverPoint.transform.forward, vector32);
            if (single1 < 1f - coverPoint.coverDot)
            {
                continue;
            }
            float single2 = Vector3.Distance(currentPosition, vector3);
            float single3 = 0f;
            if (minRange > 0f)
            {
                single3 = single3 - (1f - Mathf.InverseLerp(0f, minRange, single2)) * 100f;
            }
            float single4 = Mathf.Abs(vector3.y - currentPosition.y);
            single3 = single3 + (1f - Mathf.InverseLerp(1f, 5f, single4)) * 500f;
            single3 = single3 + Mathf.InverseLerp(1f - coverPoint.coverDot, 1f, single1) * 50f;
            single3 = single3 + (1f - Mathf.InverseLerp(2f, maxRange, single2)) * 100f;
            float single5 = 1f - Mathf.InverseLerp(4f, 10f, Vector3.Distance(currentPosition, hideFromPosition));
            vector31 = coverPoint.transform.position - currentPosition;
            float single6 = Vector3.Dot(vector31.normalized, vector32);
            single3 = single3 - Mathf.InverseLerp(-1f, 0.25f, single6) * 50f * single5;
            if (single3 <= single)
            {
                continue;
            }
            aICoverPoint = coverPoint;
            single       = single3;
        }
        if (aICoverPoint)
        {
            return(aICoverPoint);
        }
        return(null);
    }
        public override void StateEnter()
        {
            base.StateEnter();
            base.GetEntity().SetDesiredSpeed(HumanNPC.SpeedType.Sprint);
            AIInformationZone informationZone = base.GetEntity().GetInformationZone();

            if (informationZone != null)
            {
                AICoverPoint bestCoverPoint = informationZone.GetBestCoverPoint(base.GetEntity().ServerPosition, base.GetEntity().ServerPosition, 25f, 50f, base.GetEntity());
                if (bestCoverPoint)
                {
                    bestCoverPoint.SetUsedBy(base.GetEntity(), 10f);
                }
                Vector3 vector3 = (bestCoverPoint == null ? base.GetEntity().ServerPosition : bestCoverPoint.transform.position);
                base.GetEntity().SetDestination(vector3);
                this.brain.mainInterestPoint = vector3;
            }
        }
示例#7
0
        public override void StateEnter()
        {
            base.StateEnter();
            GetEntity().SetDesiredSpeed(HumanNPC.SpeedType.Sprint);
            AIInformationZone informationZone = GetEntity().GetInformationZone(GetEntity().transform.position);

            if (informationZone != null)
            {
                AICoverPoint bestCoverPoint = informationZone.GetBestCoverPoint(GetEntity().transform.position, GetEntity().transform.position, 25f, 50f, GetEntity());
                if ((bool)bestCoverPoint)
                {
                    bestCoverPoint.SetUsedBy(GetEntity(), 10f);
                }
                Vector3 vector = ((bestCoverPoint == null) ? GetEntity().transform.position : bestCoverPoint.transform.position);
                GetEntity().SetDestination(vector);
                brain.mainInterestPoint = vector;
            }
        }
示例#8
0
        public override void StateEnter()
        {
            base.StateEnter();
            this.GetEntity().SetDesiredSpeed(HumanNPC.SpeedType.Sprint);
            AIInformationZone informationZone = this.GetEntity().GetInformationZone();

            if (!Object.op_Inequality((Object)informationZone, (Object)null))
            {
                return;
            }
            AICoverPoint bestCoverPoint = informationZone.GetBestCoverPoint(this.GetEntity().ServerPosition, this.GetEntity().ServerPosition, 25f, 50f, (BaseEntity)this.GetEntity());

            if (Object.op_Implicit((Object)bestCoverPoint))
            {
                bestCoverPoint.SetUsedBy((BaseEntity)this.GetEntity(), 10f);
            }
            Vector3 newDestination = Object.op_Equality((Object)bestCoverPoint, (Object)null) ? this.GetEntity().ServerPosition : ((Component)bestCoverPoint).get_transform().get_position();

            this.GetEntity().SetDestination(newDestination);
            this.brain.mainInterestPoint = newDestination;
        }
        public override void StateThink(float delta)
        {
            bool flag;

            base.StateThink(delta);
            float single  = 2f;
            float single1 = 0f;

            if (Time.time > this.lastCoverTime + single && !this.isFleeing)
            {
                Vector3           vector3         = (base.GetEntity().currentTarget ? base.GetEntity().currentTarget.ServerPosition : base.GetEntity().ServerPosition + (base.GetEntity().LastAttackedDir * 30f));
                float             single2         = (base.GetEntity().currentTarget != null ? base.GetEntity().DistanceToTarget() : 30f);
                AIInformationZone informationZone = base.GetEntity().GetInformationZone();
                if (informationZone != null)
                {
                    float        secondsSinceAttacked = base.GetEntity().SecondsSinceAttacked;
                    float        single3        = (secondsSinceAttacked < 2f ? 2f : 0f);
                    float        single4        = 20f;
                    AICoverPoint bestCoverPoint = informationZone.GetBestCoverPoint(base.GetEntity().ServerPosition, vector3, single3, single4, base.GetEntity());
                    if (bestCoverPoint)
                    {
                        bestCoverPoint.SetUsedBy(base.GetEntity(), 5f);
                    }
                    Vector3 vector31 = (bestCoverPoint == null ? base.GetEntity().ServerPosition : bestCoverPoint.transform.position);
                    base.GetEntity().SetDestination(vector31);
                    float single5 = Vector3.Distance(vector31, base.GetEntity().ServerPosition);
                    base.GetEntity().DistanceToTarget();
                    int num  = (int)((secondsSinceAttacked >= 4f ? false : base.GetEntity().AmmoFractionRemaining() <= 0.25f));
                    int num1 = (int)((base.GetEntity().healthFraction >= 0.5f || secondsSinceAttacked >= 1f ? false : Time.time > single1));
                    if (single2 > 6f && single5 > 6f || base.GetEntity().currentTarget == null)
                    {
                        this.isFleeing = true;
                        single1        = Time.time + UnityEngine.Random.Range(4f, 7f);
                    }
                    if (single5 > 1f)
                    {
                        base.GetEntity().ClearStationaryAimPoint();
                    }
                }
                this.lastCoverTime = Time.time;
            }
            bool flag1 = Vector3.Distance(base.GetEntity().ServerPosition, base.GetEntity().finalDestination) <= 0.25f;

            if (!this.inCover & flag1)
            {
                if (this.isFleeing)
                {
                    base.GetEntity().SetStationaryAimPoint(base.GetEntity().finalDestination + (-base.GetEntity().eyes.BodyForward() * 5f));
                }
                else if (base.GetEntity().currentTarget)
                {
                    base.GetEntity().SetStationaryAimPoint(base.GetEntity().ServerPosition + (Vector3Ex.Direction2D(base.GetEntity().currentTarget.ServerPosition, base.GetEntity().ServerPosition) * 5f));
                }
            }
            this.inCover = flag1;
            if (!this.inCover)
            {
                this.timeInCover = 0f;
            }
            else
            {
                this.timeInCover += delta;
            }
            base.GetEntity().SetDucked(this.inCover);
            if (this.inCover)
            {
                this.isFleeing = false;
            }
            if (base.GetEntity().AmmoFractionRemaining() == 0f || this.isFleeing)
            {
                flag = true;
            }
            else
            {
                flag = (base.GetEntity().CanSeeTarget() || !this.inCover || base.GetEntity().SecondsSinceDealtDamage <= 2f ? false : base.GetEntity().AmmoFractionRemaining() < 0.25f);
            }
            if (flag)
            {
                base.GetEntity().AttemptReload();
            }
            if (!this.inCover)
            {
                if (base.TimeInState() > 1f && this.isFleeing)
                {
                    base.GetEntity().SetDesiredSpeed(HumanNPC.SpeedType.Sprint);
                    return;
                }
                base.GetEntity().SetDesiredSpeed(HumanNPC.SpeedType.Walk);
            }
        }
示例#10
0
    public AICoverPoint GetBestCoverPoint(Vector3 currentPosition, Vector3 hideFromPosition, float minRange = 0f, float maxRange = 20f, BaseEntity forObject = null, bool allowObjectToReuse = true)
    {
        AICoverPoint aICoverPoint = null;
        float        num          = 0f;
        AIMovePoint  closestRaw   = GetClosestRaw(currentPosition, true);
        int          pointCount;

        AICoverPoint[] coverPointsInRange = GetCoverPointsInRange(currentPosition, maxRange, out pointCount);
        if (coverPointsInRange == null || pointCount <= 0)
        {
            return(null);
        }
        for (int i = 0; i < pointCount; i++)
        {
            AICoverPoint aICoverPoint2 = coverPointsInRange[i];
            Vector3      position      = aICoverPoint2.transform.position;
            Vector3      normalized    = (hideFromPosition - position).normalized;
            float        num2          = Vector3.Dot(aICoverPoint2.transform.forward, normalized);
            if (num2 < 1f - aICoverPoint2.coverDot)
            {
                continue;
            }
            float num3 = -1f;
            if (UseCalculatedCoverDistances && closestRaw != null && closestRaw.distancesToCover.Contains(aICoverPoint2) && !isDirty)
            {
                num3 = closestRaw.distancesToCover[aICoverPoint2];
                if (num3 == -2f)
                {
                    continue;
                }
            }
            else
            {
                num3 = Vector3.Distance(currentPosition, position);
            }
            float num4 = 0f;
            if (aICoverPoint2.InUse())
            {
                bool flag = aICoverPoint2.IsUsedBy(forObject);
                if (!(allowObjectToReuse && flag))
                {
                    num4 -= 1000f;
                }
            }
            if (minRange > 0f)
            {
                num4 -= (1f - Mathf.InverseLerp(0f, minRange, num3)) * 100f;
            }
            float value = Mathf.Abs(position.y - currentPosition.y);
            num4 += (1f - Mathf.InverseLerp(1f, 5f, value)) * 500f;
            num4 += Mathf.InverseLerp(1f - aICoverPoint2.coverDot, 1f, num2) * 50f;
            num4 += (1f - Mathf.InverseLerp(2f, maxRange, num3)) * 100f;
            float num5   = 1f - Mathf.InverseLerp(4f, 10f, Vector3.Distance(currentPosition, hideFromPosition));
            float value2 = Vector3.Dot((aICoverPoint2.transform.position - currentPosition).normalized, normalized);
            num4 -= Mathf.InverseLerp(-1f, 0.25f, value2) * 50f * num5;
            if (num4 > num)
            {
                aICoverPoint = aICoverPoint2;
                num          = num4;
            }
        }
        if ((bool)aICoverPoint)
        {
            return(aICoverPoint);
        }
        return(null);
    }
示例#11
0
    public bool ProcessDistancesAttempt()
    {
        float realtimeSinceStartup = UnityEngine.Time.realtimeSinceStartup;
        float budgetSeconds        = AIThinkManager.framebudgetms / 1000f * 0.25f;

        if (realtimeSinceStartup < lastNavmeshBuildTime + 60f)
        {
            budgetSeconds = 0.1f;
        }
        int         areaMask    = 1 << NavMesh.GetAreaFromName("HumanNPC");
        NavMeshPath navMeshPath = new NavMeshPath();

        while (PassesBudget(realtimeSinceStartup, budgetSeconds))
        {
            AIMovePoint aIMovePoint = movePoints[processIndex];
            bool        flag        = true;
            int         num         = 0;
            for (int num2 = aIMovePoint.distances.Keys.Count - 1; num2 >= 0; num2--)
            {
                AIMovePoint aIMovePoint2 = aIMovePoint.distances.Keys[num2];
                if (!movePoints.Contains(aIMovePoint2))
                {
                    aIMovePoint.distances.Remove(aIMovePoint2);
                }
            }
            for (int num3 = aIMovePoint.distancesToCover.Keys.Count - 1; num3 >= 0; num3--)
            {
                AICoverPoint aICoverPoint = aIMovePoint.distancesToCover.Keys[num3];
                if (!coverPoints.Contains(aICoverPoint))
                {
                    num++;
                    aIMovePoint.distancesToCover.Remove(aICoverPoint);
                }
            }
            foreach (AICoverPoint coverPoint in coverPoints)
            {
                if (coverPoint == null || aIMovePoint.distancesToCover.Contains(coverPoint))
                {
                    continue;
                }
                float num4 = -1f;
                if (Vector3.Distance(aIMovePoint.transform.position, coverPoint.transform.position) > 40f)
                {
                    num4 = -2f;
                }
                else if (NavMesh.CalculatePath(aIMovePoint.transform.position, coverPoint.transform.position, areaMask, navMeshPath) && navMeshPath.status == NavMeshPathStatus.PathComplete)
                {
                    int num5 = navMeshPath.corners.Length;
                    if (num5 > 1)
                    {
                        Vector3 a    = navMeshPath.corners[0];
                        float   num6 = 0f;
                        for (int i = 0; i < num5; i++)
                        {
                            Vector3 vector = navMeshPath.corners[i];
                            num6 += Vector3.Distance(a, vector);
                            a     = vector;
                        }
                        num4 = num6;
                        pathSuccesses++;
                    }
                    else
                    {
                        num4 = Vector3.Distance(aIMovePoint.transform.position, coverPoint.transform.position);
                        halfPaths++;
                    }
                }
                else
                {
                    pathFails++;
                    num4 = -2f;
                }
                aIMovePoint.distancesToCover.Add(coverPoint, num4);
                if (!PassesBudget(realtimeSinceStartup, budgetSeconds))
                {
                    flag = false;
                    break;
                }
            }
            if (flag)
            {
                processIndex++;
            }
            if (processIndex >= movePoints.Count - 1)
            {
                break;
            }
        }
        return(processIndex == movePoints.Count - 1);
    }
示例#12
0
 private void RemoveCoverPoint(AICoverPoint point)
 {
     coverPoints.Remove(point);
     MarkDirty();
 }
示例#13
0
        public override StateStatus StateThink(float delta)
        {
            base.StateThink(delta);
            float num  = 2f;
            float num2 = 0f;

            if (Time.time > lastCoverTime + num && !isFleeing)
            {
                Vector3           hideFromPosition = (GetEntity().currentTarget ? GetEntity().currentTarget.transform.position : (GetEntity().transform.position + GetEntity().LastAttackedDir * 30f));
                float             num3             = ((GetEntity().currentTarget != null) ? GetEntity().DistanceToTarget() : 30f);
                AIInformationZone informationZone  = GetEntity().GetInformationZone(GetEntity().transform.position);
                if (informationZone != null)
                {
                    float secondsSinceAttacked = GetEntity().SecondsSinceAttacked;
                    float minRange             = ((secondsSinceAttacked < 2f) ? 2f : 0f);
                    float maxRange             = 25f;
                    if (currentCover != null)
                    {
                        currentCover.ClearIfUsedBy(GetEntity());
                        currentCover = null;
                    }
                    AICoverPoint bestCoverPoint = informationZone.GetBestCoverPoint(GetEntity().transform.position, hideFromPosition, minRange, maxRange, GetEntity());
                    if ((bool)bestCoverPoint)
                    {
                        bestCoverPoint.SetUsedBy(GetEntity(), 15f);
                        currentCover = bestCoverPoint;
                    }
                    Vector3 vector = ((bestCoverPoint == null) ? GetEntity().transform.position : bestCoverPoint.transform.position);
                    GetEntity().SetDestination(vector);
                    float num4 = Vector3.Distance(vector, GetEntity().transform.position);
                    bool  flag2;
                    int   num5;
                    if (secondsSinceAttacked < 4f)
                    {
                        flag2 = GetEntity().AmmoFractionRemaining() <= 0.25f;
                    }
                    else
                    {
                        num5 = 0;
                    }
                    bool flag3;
                    int  num6;
                    if (GetEntity().healthFraction < 0.5f && secondsSinceAttacked < 1f)
                    {
                        flag3 = Time.time > num2;
                    }
                    else
                    {
                        num6 = 0;
                    }
                    if ((num3 > 6f && num4 > 8f) || GetEntity().currentTarget == null)
                    {
                        isFleeing = true;
                        num2      = Time.time + Random.Range(4f, 7f);
                    }
                    if (num4 > 1f)
                    {
                        GetEntity().ClearStationaryAimPoint();
                    }
                }
                lastCoverTime = Time.time;
            }
            bool flag = Vector3.Distance(GetEntity().transform.position, GetEntity().finalDestination) <= 0.25f;

            if (!inCover && flag)
            {
                if (isFleeing)
                {
                    GetEntity().SetStationaryAimPoint(GetEntity().finalDestination + -GetEntity().eyes.BodyForward() * 5f);
                }
                else if ((bool)GetEntity().currentTarget)
                {
                    GetEntity().SetStationaryAimPoint(GetEntity().transform.position + Vector3Ex.Direction2D(GetEntity().currentTarget.transform.position, GetEntity().transform.position) * 5f);
                }
            }
            inCover = flag;
            if (inCover)
            {
                timeInCover += delta;
            }
            else
            {
                timeInCover = 0f;
            }
            GetEntity().SetDucked(inCover);
            if (inCover)
            {
                isFleeing = false;
            }
            if (GetEntity().AmmoFractionRemaining() == 0f || isFleeing || (!GetEntity().CanSeeTarget() && inCover && GetEntity().SecondsSinceDealtDamage > 2f && GetEntity().AmmoFractionRemaining() < 0.25f))
            {
                GetEntity().AttemptReload();
            }
            if (!inCover)
            {
                if (base.TimeInState > 1f && isFleeing)
                {
                    GetEntity().SetDesiredSpeed(HumanNPC.SpeedType.Sprint);
                }
                else
                {
                    GetEntity().SetDesiredSpeed(HumanNPC.SpeedType.Walk);
                }
            }
            return(StateStatus.Running);
        }
示例#14
0
        public override void StateThink(float delta)
        {
            base.StateThink(delta);
            float num1 = 2f;
            float num2 = 0.0f;

            if ((double)Time.get_time() > (double)this.lastCoverTime + (double)num1 && !this.isFleeing)
            {
                Vector3           hideFromPosition = Object.op_Implicit((Object)this.GetEntity().currentTarget) ? this.GetEntity().currentTarget.ServerPosition : Vector3.op_Addition(this.GetEntity().ServerPosition, Vector3.op_Multiply(this.GetEntity().LastAttackedDir, 30f));
                float             num3             = Object.op_Inequality((Object)this.GetEntity().currentTarget, (Object)null) ? this.GetEntity().DistanceToTarget() : 30f;
                AIInformationZone informationZone  = this.GetEntity().GetInformationZone();
                if (Object.op_Inequality((Object)informationZone, (Object)null))
                {
                    float        secondsSinceAttacked = this.GetEntity().SecondsSinceAttacked;
                    float        minRange             = (double)secondsSinceAttacked < 2.0 ? 2f : 0.0f;
                    float        maxRange             = 20f;
                    AICoverPoint bestCoverPoint       = informationZone.GetBestCoverPoint(this.GetEntity().ServerPosition, hideFromPosition, minRange, maxRange, (BaseEntity)this.GetEntity());
                    if (Object.op_Implicit((Object)bestCoverPoint))
                    {
                        bestCoverPoint.SetUsedBy((BaseEntity)this.GetEntity(), 5f);
                    }
                    Vector3 newDestination = Object.op_Equality((Object)bestCoverPoint, (Object)null) ? this.GetEntity().ServerPosition : ((Component)bestCoverPoint).get_transform().get_position();
                    this.GetEntity().SetDestination(newDestination);
                    float  num4   = Vector3.Distance(newDestination, this.GetEntity().ServerPosition);
                    double target = (double)this.GetEntity().DistanceToTarget();
                    int    num5   = (double)secondsSinceAttacked >= 4.0 ? 0 : ((double)this.GetEntity().AmmoFractionRemaining() <= 0.25 ? 1 : 0);
                    int    num6   = (double)this.GetEntity().healthFraction >= 0.5 || (double)secondsSinceAttacked >= 1.0 ? 0 : ((double)Time.get_time() > (double)num2 ? 1 : 0);
                    if ((double)num3 > 6.0 && (double)num4 > 6.0 || Object.op_Equality((Object)this.GetEntity().currentTarget, (Object)null))
                    {
                        this.isFleeing = true;
                        float num7 = Time.get_time() + Random.Range(4f, 7f);
                    }
                    if ((double)num4 > 1.0)
                    {
                        this.GetEntity().ClearStationaryAimPoint();
                    }
                }
                this.lastCoverTime = Time.get_time();
            }
            bool flag = (double)Vector3.Distance(this.GetEntity().ServerPosition, this.GetEntity().finalDestination) <= 0.25;

            if (!this.inCover & flag)
            {
                if (this.isFleeing)
                {
                    this.GetEntity().SetStationaryAimPoint(Vector3.op_Addition(this.GetEntity().finalDestination, Vector3.op_Multiply(Vector3.op_UnaryNegation(this.GetEntity().eyes.BodyForward()), 5f)));
                }
                else if (Object.op_Implicit((Object)this.GetEntity().currentTarget))
                {
                    this.GetEntity().SetStationaryAimPoint(Vector3.op_Addition(this.GetEntity().ServerPosition, Vector3.op_Multiply(Vector3Ex.Direction2D(this.GetEntity().currentTarget.ServerPosition, this.GetEntity().ServerPosition), 5f)));
                }
            }
            this.inCover = flag;
            if (this.inCover)
            {
                this.timeInCover += delta;
            }
            else
            {
                this.timeInCover = 0.0f;
            }
            this.GetEntity().SetDucked(this.inCover);
            if (this.inCover)
            {
                this.isFleeing = false;
            }
            if (((double)this.GetEntity().AmmoFractionRemaining() == 0.0 || this.isFleeing ? 1 : (this.GetEntity().CanSeeTarget() || !this.inCover || (double)this.GetEntity().SecondsSinceDealtDamage <= 2.0 ? 0 : ((double)this.GetEntity().AmmoFractionRemaining() < 0.25 ? 1 : 0))) != 0)
            {
                this.GetEntity().AttemptReload();
            }
            if (this.inCover)
            {
                return;
            }
            if ((double)this.TimeInState() > 1.0 && this.isFleeing)
            {
                this.GetEntity().SetDesiredSpeed(HumanNPC.SpeedType.Sprint);
            }
            else
            {
                this.GetEntity().SetDesiredSpeed(HumanNPC.SpeedType.Walk);
            }
        }