Пример #1
0
 private void PushPathBlockedStateNew(List <Mover> obstacles, bool forceBlock)
 {
     if (this.AIController != null && !Cutscene.CutsceneActive)
     {
         if (!forceBlock && !this.AIController.StateManager.CurrentState.AllowBlockedMovement())
         {
             return;
         }
         this.SaveBlockedRoute();
         this.m_desiredHeading = GameUtilities.V3Subtract2D(this.m_nextCornerPos, base.transform.position);
         this.m_desiredHeading.Normalize();
         this.m_heading = this.m_desiredHeading;
         if (this.AIController is PartyMemberAI)
         {
             if (this.AIController.StateManager.CurrentState is AI.Player.WaitForClearPath)
             {
                 return;
             }
             AI.Player.WaitForClearPath waitForClearPath = AIStateManager.StatePool.Allocate <AI.Player.WaitForClearPath>();
             waitForClearPath.Obstacles.AddRange(obstacles);
             waitForClearPath.BlockerDistance = 0.5f;
             this.AIController.StateManager.PushState(waitForClearPath, false);
         }
         else
         {
             if (this.AIController.StateManager.CurrentState is AI.Plan.WaitForClearPath)
             {
                 return;
             }
             if (IEModOptions.ImprovedAI)                     // added this if statement
             {
                 // race condition if both Mover and PathFindingManager decide they are blocked in the same tick
                 if (this.AIController.StateManager.CurrentState is AI.Plan.ApproachTarget)
                 {
                     return;
                 }
                 var pathToPosition = this.AIController.StateManager.CurrentState as AI.Achievement.PathToPosition;
                 if (pathToPosition != null)
                 {
                     if (((Mod_AI_PathToPosition)pathToPosition).TryToPickNewTarget(true))
                     {
                         return;
                     }
                 }
             }
             AI.Plan.WaitForClearPath waitForClearPath2 = AIStateManager.StatePool.Allocate <AI.Plan.WaitForClearPath>();
             waitForClearPath2.Obstacles.AddRange(obstacles);
             waitForClearPath2.BlockerDistance = 0.5f;
             this.AIController.StateManager.PushState(waitForClearPath2, false);
         }
     }
 }
Пример #2
0
        private List <Mover> GetObstaclesToAvoidNew(float range)
        {
            Mover.s_potentialObstacles.Clear();
            float      num           = range * range;
            GameObject currentTarget = this.m_aiController.CurrentTarget;
            Mover      y             = null;

            if (currentTarget != null)
            {
                y = currentTarget.GetComponent <Mover>();
                if (IEModOptions.ImprovedAI)                 // added this if statement
                {
                    // reset range to the distance between us and our target
                    num = Math.Min(num, GameUtilities.V3Subtract2D(y.transform.position, base.transform.position).sqrMagnitude);
                }
            }
            for (int i = 0; i < Mover.s_moverList.Count; i++)
            {
                Mover mover = Mover.s_moverList[i];
                if (!(mover == this) && !(mover == y) && mover.gameObject.activeInHierarchy)
                {
                    if (mover.IsPathingObstacle())
                    {
                        if (!mover.IsMoving() || Vector2.Dot(this.m_desiredHeading, mover.m_desiredHeading) <= 0f || (this.m_desiredSpeed >= this.GetRunSpeed() && mover.m_desiredSpeed < mover.GetRunSpeed()))
                        {
                            float sqrMagnitude = GameUtilities.V3Subtract2D(mover.transform.position, base.transform.position).sqrMagnitude;
                            if (sqrMagnitude <= num)
                            {
                                mover.m_obstacleCluster = null;
                                Mover.s_potentialObstacles.Add(mover);
                            }
                        }
                    }
                }
            }
            return(Mover.s_potentialObstacles);
        }
Пример #3
0
        public void UpdateVerticesRevised()
        {
            //IEDebug.Log("In UpdateVertices()");
            if (this.m_revealList.Count <= 0 || this.m_fogVertices == null ||
                (this.m_fogAlphasStaging == null || this.m_fogDesiredAlphas == null))
            {
                return;
            }
            for (int index = 0; index < this.m_prevUpdateList.Count; ++index)
            {
                this.m_fogUpdateState[this.m_prevUpdateList[index]] = false;
            }
            float mDeltaTime = this.m_deltaTime / 0.5f;

            if (this.m_disableFogFading || (double)mDeltaTime > 1.0)
            {
                mDeltaTime = 1f;
            }
            this.m_updateList.Clear();
            this.m_underRevealerList.Clear();
            this.m_candidates.Clear();
            int num2 = 19;
            int num3 = num2 * 2 + 1;
            int num4 = num3 * num3;

            this.m_groundPlane.normal   = Vector3.up;
            this.m_groundPlane.distance = 0.0f;
            for (int index1 = 0; index1 < this.m_revealList.Count; ++index1)
            {
                FogOfWar.Revealer revealer1 = this.m_revealList[index1];
                if (!revealer1.RequiresRefresh)
                {
                    if (revealer1.HasTrigger)
                    {
                        if ((double)revealer1.TriggerBoxSize.sqrMagnitude > 0)
                        {
                            float triggerPos  = revealer1.TriggerPos.x - revealer1.TriggerBoxSize.x * 0.5f;
                            float triggerPos1 = revealer1.TriggerPos.x + revealer1.TriggerBoxSize.x * 0.5f;
                            float triggerPos2 = revealer1.TriggerPos.z - revealer1.TriggerBoxSize.z * 0.5f;
                            float triggerPos3 = revealer1.TriggerPos.z + revealer1.TriggerBoxSize.z * 0.5f;
                            bool  flag        = false;
                            for (int index2 = 0; index2 < this.m_revealList.Count; ++index2)
                            {
                                FogOfWar.Revealer revealer2 = this.m_revealList[index2];
                                if (revealer2.TriggersBoxColliders && (double)revealer2.WorldPos.x > (double)triggerPos &&
                                    ((double)revealer2.WorldPos.x < (double)triggerPos1 &&
                                     (double)revealer2.WorldPos.z > (double)triggerPos2) &&
                                    (double)revealer2.WorldPos.z < (double)triggerPos3)
                                {
                                    flag = true;
                                    break;
                                }
                            }
                            if (!flag)
                            {
                                continue;
                            }
                        }
                        else if (this.PointVisible(revealer1.TriggerPos))
                        {
                            int x = 0;
                            int y = 0;
                            this.WorldToFogOfWar(revealer1.TriggerPos, out x, out y);
                            if (!this.m_fogLOSRevealed[x * this.m_fogVertsPerRow + y])
                            {
                                continue;
                            }
                        }
                        else
                        {
                            continue;
                        }
                    }
                    int x1 = 0;
                    int y1 = 0;
                    this.WorldToFogOfWar(revealer1.WorldPos, out x1, out y1);
                    int losDistance1       = (int)(((double)revealer1.LOSDistance + 3.0) * 1.0 / (double)this.m_fogTileWidth) + 1;
                    int losDistance2       = (int)(((double)revealer1.LOSDistance + 3.0) * 1.0 / (double)this.m_fogTileHeight) + 1;
                    int num11              = x1 - losDistance1;
                    int num12              = y1 - losDistance2;
                    int mFogVertsPerColumn = x1 + losDistance1;
                    int mFogVertsPerRow2   = y1 + losDistance2;
                    FogOfWar.RevealerCandidate revealerCandidate = new FogOfWar.RevealerCandidate();
                    revealerCandidate.Revealer         = revealer1;
                    revealerCandidate.UseBacksideVerts = false;
                    revealerCandidate.OriginX          = x1;
                    revealerCandidate.OriginY          = y1;
                    revealerCandidate.OriginIndex      = x1 * this.m_fogVertsPerRow + y1;
                    if (this.m_los == null ||
                        revealerCandidate.OriginIndex >= 0 && revealerCandidate.OriginIndex < this.m_los.Vertices.Length)
                    {
                        this.m_candidates.Add(revealerCandidate);
                        Ray theRay1 = new Ray(revealer1.WorldPos, -this.CameraPlane.normal);
                        revealer1.CameraPos = FogOfWar.GetCameraPlaneRayIntersectionPosition(this.CameraPlane, theRay1) +
                                              this.CameraPlane.normal * 0.5f;
                        Ray theRay2 = new Ray(revealer1.WorldPos - this.m_cameraForward * 500f, this.m_cameraForward);
                        revealerCandidate.WorldPos = this.m_levelInfo.GetGroundPlaneRayIntersectionPosition(this.m_groundPlane, theRay2);
                        if (this.m_los != null && this.m_los.BacksideVertices.ContainsKey(revealerCandidate.OriginIndex))
                        {
                            int index2 = -1;
                            for (int index3 = 0; index3 < this.m_doorLookupGuid.Length; ++index3)
                            {
                                if (this.m_doorLookupGuid[index3] == this.m_los.BacksideVertices[revealerCandidate.OriginIndex].DoorID)
                                {
                                    index2 = index3;
                                    break;
                                }
                            }
                            if (index2 >= 0 && this.m_doorLookupValidation[index2])
                            {
                                Vector2 rhs = GameUtilities.V3Subtract2D(revealer1.WorldPos, this.m_doorLookupPos[index2]);
                                rhs.Normalize();
                                if ((double)Vector2.Dot(this.m_doorLookupForward[index2], rhs) < 0.0)
                                {
                                    revealerCandidate.UseBacksideVerts = true;
                                }
                            }
                        }
                        if (num11 < 0)
                        {
                            num11 = 0;
                        }
                        if (num12 < 0)
                        {
                            num12 = 0;
                        }
                        if (mFogVertsPerColumn >= this.m_fogVertsPerColumn)
                        {
                            mFogVertsPerColumn = this.m_fogVertsPerColumn - 1;
                        }
                        if (mFogVertsPerRow2 >= this.m_fogVertsPerRow)
                        {
                            mFogVertsPerRow2 = this.m_fogVertsPerRow - 1;
                        }
                        for (int index2 = num11; index2 <= mFogVertsPerColumn; ++index2)
                        {
                            for (int index3 = num12; index3 <= mFogVertsPerRow2; ++index3)
                            {
                                int mFogVertsPerRow3 = index2 * this.m_fogVertsPerRow + index3;
                                if (!this.m_fogUpdateState[mFogVertsPerRow3])
                                {
                                    this.m_updateList.Add(mFogVertsPerRow3);
                                    this.m_underRevealerList.Add(mFogVertsPerRow3);
                                    this.m_fogUpdateState[mFogVertsPerRow3]   = true;
                                    this.m_fogDesiredAlphas[mFogVertsPerRow3] = this.m_fogAlphasStaging[mFogVertsPerRow3].y;
                                }
                            }
                        }
                    }
                }
            }
            this.m_fadeOutList.Clear();
            for (int index1 = 0; index1 < this.m_prevUpdateList.Count; ++index1)
            {
                int index2 = this.m_prevUpdateList[index1];
                if (!this.m_fogUpdateState[index2])
                {
                    this.m_updateList.Add(index2);
                    this.m_fadeOutList.Add(index2);
                    this.m_fogDesiredAlphas[index2] = this.m_fogAlphasStaging[index2].y;
                }
            }
            for (int index = 0; index < this.m_prevUpdateList.Count; ++index)
            {
                this.m_fogLOSRevealed[this.m_prevUpdateList[index]] = false;
            }
            this.m_prevUpdateList.Clear();
            this.m_prevUpdateList.AddRange((IEnumerable <int>) this.m_underRevealerList);
            for (int index1 = 0; index1 < this.m_updateList.Count; ++index1)
            {
                int   index2            = this.m_updateList[index1];
                float mFogDesiredAlpha  = this.m_fogDesiredAlphas[index2];
                float mFogAlphasStaging = this.m_fogAlphasStaging[index2].y;
                float single            = mFogAlphasStaging;
                float single1           = mFogAlphasStaging;
                for (int index3 = 0; index3 < this.m_candidates.Count; ++index3)
                {
                    FogOfWar.RevealerCandidate revealerCandidate = this.m_candidates[index3];
                    float minAlpha = 0.0f;
                    if (this.m_los != null && (!revealerCandidate.Revealer.HasTrigger || revealerCandidate.Revealer.RespectLOS))
                    {
                        FogOfWarLOS.VertexData[] vertexDataArray = this.m_los.Vertices[revealerCandidate.OriginIndex];
                        if (revealerCandidate.UseBacksideVerts)
                        {
                            vertexDataArray = this.m_los.BacksideVertices[revealerCandidate.OriginIndex].VertexData;
                        }
                        if (vertexDataArray != null)
                        {
                            int mFogVertsPerRow  = index2 / this.m_fogVertsPerRow;
                            int mFogVertsPerRow1 = index2 % this.m_fogVertsPerRow;
                            int originX          = mFogVertsPerRow - revealerCandidate.OriginX + num2;
                            int originY          = mFogVertsPerRow1 - revealerCandidate.OriginY + num2;
                            int index4           = originX * num3 + originY;
                            if (index4 >= 0 && index4 < num4)
                            {
                                if (vertexDataArray[index4] == null)
                                {
                                    minAlpha = 0.0f;
                                }
                                else
                                {
                                    minAlpha = vertexDataArray[index4].MinAlpha;
                                    if (vertexDataArray[index4].DoorIndices != null)
                                    {
                                        for (int index5 = 0; index5 < vertexDataArray[index4].DoorIndices.Length; ++index5)
                                        {
                                            byte num13 = vertexDataArray[index4].DoorIndices[index5];
                                            if (this.m_doorLookupValidation[(int)num13] && this.m_doorLookup[(int)num13].CurrentState != OCL.State.Open &&
                                                this.m_doorLookup[(int)num13].CurrentState != OCL.State.SealedOpen)
                                            {
                                                minAlpha = this.m_fogAlphasStaging[index2].y;
                                                break;
                                            }
                                        }
                                    }
                                }
                                if ((double)minAlpha > (double)this.m_fogAlphasStaging[index2].y)
                                {
                                    minAlpha = this.m_fogAlphasStaging[index2].y;
                                }
                            }
                            else
                            {
                                continue;
                            }
                        }
                    }
                    //  #ZEN(Changed) controls the alpha value of explored fog
                    float exploredFogAlpha = 0.0f;                     //Mathf.Max(0.7f, minAlpha);
                    float lOSDistance3     = revealerCandidate.Revealer.LOSDistance + 3f;
                    float lOSDistance4     = revealerCandidate.Revealer.LOSDistance - 3f;
                    float single2          = GameUtilities.V3Distance2D(this.m_worldVertices[index2], revealerCandidate.WorldPos);
                    if ((double)single2 > (double)lOSDistance3)                       // if single2 > lOSDistance3
                    {
                        mFogDesiredAlpha = this.m_fogAlphasStaging[index2].y;
                    }
                    else if ((double)single2 > (double)revealerCandidate.Revealer.LOSDistance)
                    {
                        float lOSDistance = (float)((1.0 - ((double)lOSDistance3 - (double)single2) / 3.0) * 0.300000011920929 + 0.7f);
                        if ((double)lOSDistance < (double)minAlpha)
                        {
                            lOSDistance = minAlpha;
                        }
                        if ((double)lOSDistance < (double)this.m_fogAlphasStaging[index2].y)
                        {
                            mFogAlphasStaging = (double)lOSDistance <= (double)exploredFogAlpha ? exploredFogAlpha : lOSDistance;
                        }
                        if ((double)lOSDistance < (double)this.m_fogDesiredAlphas[index2])
                        {
                            mFogDesiredAlpha = lOSDistance;
                        }
                    }
                    else if ((double)single2 < (double)lOSDistance4 - 1.0)
                    {
                        mFogDesiredAlpha  = minAlpha;
                        mFogAlphasStaging = exploredFogAlpha;
                    }
                    else
                    {
                        float lOSDistance =
                            (float)((1.0 - ((double)revealerCandidate.Revealer.LOSDistance - (double)single2) / 3.0) * 0.699999988079071);
                        if ((double)lOSDistance < (double)minAlpha)
                        {
                            lOSDistance = minAlpha;
                        }
                        if ((double)lOSDistance < (double)this.m_fogAlphasStaging[index2].y)
                        {
                            mFogAlphasStaging = (double)lOSDistance <= (double)exploredFogAlpha ? exploredFogAlpha : lOSDistance;
                        }
                        if ((double)lOSDistance < (double)this.m_fogDesiredAlphas[index2])
                        {
                            mFogDesiredAlpha = lOSDistance;
                        }
                    }
                    if (!revealerCandidate.Revealer.HasTrigger && (double)mFogDesiredAlpha < 0.699999988079071)
                    {
                        this.m_fogLOSRevealed[index2] = true;
                    }
                    if (revealerCandidate.Revealer.RevealOnly && (double)mFogDesiredAlpha < 0.699999988079071)
                    {
                        mFogDesiredAlpha = 0.0f;
                    }
                    if ((double)mFogDesiredAlpha < (double)single)
                    {
                        single = mFogDesiredAlpha;
                    }
                    if ((double)mFogAlphasStaging < (double)single1)
                    {
                        single1 = mFogAlphasStaging;
                    }
                }
                if ((double)single > (double)single1)
                {
                    single = single1;
                }
                this.m_fogDesiredAlphas[index2]   = single;
                this.m_fogAlphasStaging[index2].y = single1;
                if (!this.Disabled && (double)this.m_fogAlphasStaging[index2].y < 0.699999988079071)
                {
                    this.m_fogAlphasStaging[index2].y = 0.0f;
                }
                float mFogDesiredAlphas1 = this.m_fogDesiredAlphas[index2] - this.m_fogAlphasStaging[index2].x;
                if ((double)Mathf.Abs(mFogDesiredAlphas1) <= (double)mDeltaTime)
                {
                    this.m_fogAlphasStaging[index2].x = this.m_fogDesiredAlphas[index2];
                }
                else
                {
                    if ((double)mFogDesiredAlphas1 > 0.0)
                    {
                        this.m_fogAlphasStaging[index2].x += mDeltaTime;
                    }
                    else
                    {
                        this.m_fogAlphasStaging[index2].x -= mDeltaTime;
                    }
                    this.m_fogUpdateState[index2] = true;
                }
            }
            for (int index1 = 0; index1 < this.m_fadeOutList.Count; ++index1)
            {
                int index2 = this.m_fadeOutList[index1];
                if ((double)this.m_fogAlphasStaging[index2].x < 0.699999988079071)
                {
                    this.m_prevUpdateList.Add(index2);
                }
            }
        }