private void AddCoverPoint(AICoverPoint point) { if (!coverPoints.Contains(point)) { coverPoints.Add(point); MarkDirty(); } }
public override void StateLeave() { base.StateLeave(); GetEntity().SetDucked(false); GetEntity().ClearStationaryAimPoint(); if ((bool)currentCover) { currentCover.ClearIfUsedBy(GetEntity()); currentCover = null; } }
public override void StateEnter() { GetEntity().SetDesiredSpeed(HumanNPC.SpeedType.Walk); lastCoverTime = -10f; isFleeing = false; inCover = false; timeInCover = -1f; GetEntity().ClearStationaryAimPoint(); currentCover = null; base.StateEnter(); }
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; } }
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; } }
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); } }
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); }
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); }
private void RemoveCoverPoint(AICoverPoint point) { coverPoints.Remove(point); MarkDirty(); }
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); }
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); } }