Exemplo n.º 1
0
 public static void GaussianBlur2D(float[] data, int len1, int len2, int iterations = 1)
 {
     float[] singleArray  = data;
     float[] singleArray1 = new float[len1 * len2];
     for (int i = 0; i < iterations; i++)
     {
         for (int j = 0; j < len1; j++)
         {
             int num  = Mathf.Max(0, j - 1);
             int num1 = Mathf.Min(len1 - 1, j + 1);
             for (int k = 0; k < len2; k++)
             {
                 int   num2   = Mathf.Max(0, k - 1);
                 int   num3   = Mathf.Min(len2 - 1, k + 1);
                 float single = singleArray[j * len2 + k] * 4f + singleArray[j * len2 + num2] + singleArray[j * len2 + num3] + singleArray[num * len2 + k] + singleArray[num1 * len2 + k];
                 singleArray1[j * len2 + k] = single * 0.125f;
             }
         }
         GenericsUtil.Swap <float[]>(ref singleArray, ref singleArray1);
     }
     if (singleArray != data)
     {
         Buffer.BlockCopy(singleArray, 0, data, 0, (int)data.Length * 4);
     }
 }
Exemplo n.º 2
0
 public static void Average2D(float[] data, int len1, int len2, int len3, int iterations = 1)
 {
     float[] src = data;
     float[] dst = new float[len1 * len2 * len3];
     for (int i = 0; i < iterations; i++)
     {
         Parallel.For(0, len1, delegate(int x)
         {
             int num  = Mathf.Max(0, x - 1);
             int num2 = Mathf.Min(len1 - 1, x + 1);
             for (int j = 0; j < len2; j++)
             {
                 int num3 = Mathf.Max(0, j - 1);
                 int num4 = Mathf.Min(len2 - 1, j + 1);
                 for (int k = 0; k < len3; k++)
                 {
                     float num5 = src[(x * len2 + j) * len3 + k] + src[(x * len2 + num3) * len3 + k] + src[(x * len2 + num4) * len3 + k] + src[(num * len2 + j) * len3 + k] + src[(num2 * len2 + j) * len3 + k];
                     dst[(x * len2 + j) * len3 + k] = num5 * 0.2f;
                 }
             }
         });
         GenericsUtil.Swap(ref src, ref dst);
     }
     if (src != data)
     {
         Buffer.BlockCopy(src, 0, data, 0, data.Length * 4);
     }
 }
Exemplo n.º 3
0
    public static void Average2D(float[] data, int len1, int len2, int iterations = 1)
    {
        Action <int> action = null;

        float[] singleArray = new float[len1 * len2];
        for (int i1 = 0; i1 < iterations; i1++)
        {
            int          num4    = len1;
            Action <int> action1 = action;
            if (action1 == null)
            {
                Action <int> action2 = (int x) => {
                    int num  = Mathf.Max(0, x - 1);
                    int num1 = Mathf.Min(len1 - 1, x + 1);
                    for (int i = 0; i < len2; i++)
                    {
                        int   num2   = Mathf.Max(0, i - 1);
                        int   num3   = Mathf.Min(len2 - 1, i + 1);
                        float single = data[x * len2 + i] + data[x * len2 + num2] + data[x * len2 + num3] + data[num * len2 + i] + data[num1 * len2 + i];
                        singleArray[x * len2 + i] = single * 0.2f;
                    }
                };
                Action <int> action3 = action2;
                action  = action2;
                action1 = action3;
            }
            Parallel.For(0, num4, action1);
            GenericsUtil.Swap <float[]>(ref data, ref singleArray);
        }
        if (data != data)
        {
            Buffer.BlockCopy(data, 0, data, 0, (int)data.Length * 4);
        }
    }
Exemplo n.º 4
0
 public static void Average2D(float[] data, int len1, int len2, int iterations = 1)
 {
     float[] src = data;
     float[] dst = new float[len1 * len2];
     for (int index1 = 0; index1 < iterations; ++index1)
     {
         Parallel.For(0, len1, (Action <int>)(x =>
         {
             int num1 = Mathf.Max(0, x - 1);
             int num2 = Mathf.Min(len1 - 1, x + 1);
             for (int index = 0; index < len2; ++index)
             {
                 int num3              = Mathf.Max(0, index - 1);
                 int num4              = Mathf.Min(len2 - 1, index + 1);
                 float num5            = src[x * len2 + index] + src[x * len2 + num3] + src[x * len2 + num4] + src[num1 * len2 + index] + src[num2 * len2 + index];
                 dst[x * len2 + index] = num5 * 0.2f;
             }
         }));
         GenericsUtil.Swap <float[]>(ref src, ref dst);
     }
     if (src == data)
     {
         return;
     }
     Buffer.BlockCopy((Array)src, 0, (Array)data, 0, data.Length * 4);
 }
Exemplo n.º 5
0
 public static void GaussianBlur2D(float[] data, int len1, int len2, int iterations = 1)
 {
     float[] a = data;
     float[] b = new float[len1 * len2];
     for (int i = 0; i < iterations; i++)
     {
         for (int j = 0; j < len1; j++)
         {
             int num  = Mathf.Max(0, j - 1);
             int num2 = Mathf.Min(len1 - 1, j + 1);
             for (int k = 0; k < len2; k++)
             {
                 int   num3 = Mathf.Max(0, k - 1);
                 int   num4 = Mathf.Min(len2 - 1, k + 1);
                 float num5 = a[j * len2 + k] * 4f + a[j * len2 + num3] + a[j * len2 + num4] + a[num * len2 + k] + a[num2 * len2 + k];
                 b[j * len2 + k] = num5 * 0.125f;
             }
         }
         GenericsUtil.Swap(ref a, ref b);
     }
     if (a != data)
     {
         Buffer.BlockCopy(a, 0, data, 0, data.Length * 4);
     }
 }
Exemplo n.º 6
0
 public static void GaussianBlur2D(float[] data, int len1, int len2, int len3, int iterations = 1)
 {
     float[] src = data;
     float[] dst = new float[len1 * len2 * len3];
     for (int index1 = 0; index1 < iterations; ++index1)
     {
         Parallel.For(0, len1, (Action <int>)(x =>
         {
             int num1 = Mathf.Max(0, x - 1);
             int num2 = Mathf.Min(len1 - 1, x + 1);
             for (int index1 = 0; index1 < len2; ++index1)
             {
                 int num3 = Mathf.Max(0, index1 - 1);
                 int num4 = Mathf.Min(len2 - 1, index1 + 1);
                 for (int index2 = 0; index2 < len3; ++index2)
                 {
                     float num5 = src[(x * len2 + index1) * len3 + index2] * 4f + src[(x * len2 + num3) * len3 + index2] + src[(x * len2 + num4) * len3 + index2] + src[(num1 * len2 + index1) * len3 + index2] + src[(num2 * len2 + index1) * len3 + index2];
                     dst[(x * len2 + index1) * len3 + index2] = num5 * 0.125f;
                 }
             }
         }));
         GenericsUtil.Swap <float[]>(ref src, ref dst);
     }
     if (src == data)
     {
         return;
     }
     Buffer.BlockCopy((Array)src, 0, (Array)data, 0, data.Length * 4);
 }
Exemplo n.º 7
0
 public static void GaussianBlur2D(float[] data, int len1, int len2, int iterations = 1)
 {
     float[] a = data;
     float[] b = new float[len1 * len2];
     for (int index1 = 0; index1 < iterations; ++index1)
     {
         for (int index2 = 0; index2 < len1; ++index2)
         {
             int num1 = Mathf.Max(0, index2 - 1);
             int num2 = Mathf.Min(len1 - 1, index2 + 1);
             for (int index3 = 0; index3 < len2; ++index3)
             {
                 int   num3 = Mathf.Max(0, index3 - 1);
                 int   num4 = Mathf.Min(len2 - 1, index3 + 1);
                 float num5 = a[index2 * len2 + index3] * 4f + a[index2 * len2 + num3] + a[index2 * len2 + num4] + a[num1 * len2 + index3] + a[num2 * len2 + index3];
                 b[index2 * len2 + index3] = num5 * 0.125f;
             }
         }
         GenericsUtil.Swap <float[]>(ref a, ref b);
     }
     if (a == data)
     {
         return;
     }
     Buffer.BlockCopy((Array)a, 0, (Array)data, 0, data.Length * 4);
 }
Exemplo n.º 8
0
    public static void GaussianBlur2D(float[] data, int len1, int len2, int len3, int iterations = 1)
    {
        Action <int> action = null;

        float[] singleArray = new float[len1 * len2 * len3];
        for (int i1 = 0; i1 < iterations; i1++)
        {
            int          num4    = len1;
            Action <int> action1 = action;
            if (action1 == null)
            {
                Action <int> action2 = (int x) => {
                    int num  = Mathf.Max(0, x - 1);
                    int num1 = Mathf.Min(len1 - 1, x + 1);
                    for (int i = 0; i < len2; i++)
                    {
                        int num2 = Mathf.Max(0, i - 1);
                        int num3 = Mathf.Min(len2 - 1, i + 1);
                        for (int j = 0; j < len3; j++)
                        {
                            float single = data[(x * len2 + i) * len3 + j] * 4f + data[(x * len2 + num2) * len3 + j] + data[(x * len2 + num3) * len3 + j] + data[(num * len2 + i) * len3 + j] + data[(num1 * len2 + i) * len3 + j];
                            singleArray[(x * len2 + i) * len3 + j] = single * 0.125f;
                        }
                    }
                };
                Action <int> action3 = action2;
                action  = action2;
                action1 = action3;
            }
            Parallel.For(0, num4, action1);
            GenericsUtil.Swap <float[]>(ref data, ref singleArray);
        }
        if (data != data)
        {
            Buffer.BlockCopy(data, 0, data, 0, (int)data.Length * 4);
        }
    }
Exemplo n.º 9
0
    public override void Process(uint seed)
    {
        int priority;

        if ((ulong)World.Size < (long)this.MinSize)
        {
            return;
        }
        TerrainHeightMap heightMap = TerrainMeta.HeightMap;

        Prefab <MonumentInfo>[] prefabArray = Prefab.Load <MonumentInfo>(string.Concat("assets/bundled/prefabs/autospawn/", this.ResourceFolder), null, null, true);
        if (prefabArray == null || prefabArray.Length == 0)
        {
            return;
        }
        prefabArray.Shuffle <Prefab <MonumentInfo> >(seed);
        prefabArray.BubbleSort <Prefab <MonumentInfo> >();
        Vector3 position = TerrainMeta.Position;
        Vector3 size     = TerrainMeta.Size;
        float   single   = position.x;
        float   single1  = position.z;
        float   single2  = position.x + size.x;
        float   single3  = position.z + size.z;
        int     num      = 0;
        List <PlaceMonuments.SpawnInfo> spawnInfos = new List <PlaceMonuments.SpawnInfo>();
        int num1 = 0;
        List <PlaceMonuments.SpawnInfo> spawnInfos1 = new List <PlaceMonuments.SpawnInfo>();

        for (int i = 0; i < 10; i++)
        {
            num = 0;
            spawnInfos.Clear();
            Prefab <MonumentInfo>[] prefabArray1 = prefabArray;
            for (int j = 0; j < (int)prefabArray1.Length; j++)
            {
                Prefab <MonumentInfo> prefab = prefabArray1[j];
                if (prefab.Parameters)
                {
                    priority = (int)prefab.Parameters.Priority + (int)PrefabPriority.Low;
                }
                else
                {
                    priority = 1;
                }
                int num2 = priority;
                int num3 = num2 * num2 * num2 * num2;
                for (int k = 0; k < 10000; k++)
                {
                    float single4 = SeedRandom.Range(ref seed, single, single2);
                    float single5 = SeedRandom.Range(ref seed, single1, single3);
                    float single6 = TerrainMeta.NormalizeX(single4);
                    float single7 = TerrainMeta.NormalizeZ(single5);
                    float single8 = SeedRandom.Value(ref seed);
                    float factor  = this.Filter.GetFactor(single6, single7);
                    if (factor * factor >= single8)
                    {
                        float      height  = heightMap.GetHeight(single6, single7);
                        Vector3    vector3 = new Vector3(single4, height, single5);
                        Quaternion obj     = prefab.Object.transform.localRotation;
                        Vector3    obj1    = prefab.Object.transform.localScale;
                        if (!this.CheckRadius(spawnInfos, vector3, (float)this.Distance))
                        {
                            prefab.ApplyDecorComponents(ref vector3, ref obj, ref obj1);
                            if ((!prefab.Component || prefab.Component.CheckPlacement(vector3, obj, obj1)) && prefab.ApplyTerrainAnchors(ref vector3, obj, obj1, this.Filter) && prefab.ApplyTerrainChecks(vector3, obj, obj1, this.Filter) && prefab.ApplyTerrainFilters(vector3, obj, obj1, null) && prefab.ApplyWaterChecks(vector3, obj, obj1) && !prefab.CheckEnvironmentVolumes(vector3, obj, obj1, EnvironmentType.Underground))
                            {
                                PlaceMonuments.SpawnInfo spawnInfo = new PlaceMonuments.SpawnInfo()
                                {
                                    prefab   = prefab,
                                    position = vector3,
                                    rotation = obj,
                                    scale    = obj1
                                };
                                spawnInfos.Add(spawnInfo);
                                num += num3;
                                break;
                            }
                        }
                    }
                }
            }
            if (num > num1)
            {
                num1 = num;
                GenericsUtil.Swap <List <PlaceMonuments.SpawnInfo> >(ref spawnInfos, ref spawnInfos1);
            }
        }
        foreach (PlaceMonuments.SpawnInfo spawnInfo1 in spawnInfos1)
        {
            Prefab     prefab1    = spawnInfo1.prefab;
            Vector3    vector31   = spawnInfo1.position;
            Quaternion quaternion = spawnInfo1.rotation;
            Vector3    vector32   = spawnInfo1.scale;
            prefab1.ApplyTerrainPlacements(vector31, quaternion, vector32);
            prefab1.ApplyTerrainModifiers(vector31, quaternion, vector32);
            World.AddPrefab("Monument", prefab1.ID, vector31, quaternion, vector32);
        }
    }
Exemplo n.º 10
0
    public override void Process(uint seed)
    {
        int priority;

        if ((ulong)World.Size < (long)this.MinSize)
        {
            return;
        }
        TerrainHeightMap heightMap = TerrainMeta.HeightMap;

        Prefab <MonumentInfo>[] prefabArray = Prefab.Load <MonumentInfo>(string.Concat("assets/bundled/prefabs/autospawn/", this.ResourceFolder), null, null, true);
        if (prefabArray == null || prefabArray.Length == 0)
        {
            return;
        }
        prefabArray.Shuffle <Prefab <MonumentInfo> >(seed);
        prefabArray.BubbleSort <Prefab <MonumentInfo> >();
        Vector3 position = TerrainMeta.Position;
        Vector3 size     = TerrainMeta.Size;
        float   maxDistanceFromTerrain = position.x - (float)this.MaxDistanceFromTerrain;
        float   minDistanceFromTerrain = position.x - (float)this.MinDistanceFromTerrain;
        float   single = position.x + size.x + (float)this.MinDistanceFromTerrain;
        float   maxDistanceFromTerrain1 = position.x + size.x + (float)this.MaxDistanceFromTerrain;
        float   single1 = position.z - (float)this.MaxDistanceFromTerrain;
        int     num     = this.MinDistanceFromTerrain;
        float   minDistanceFromTerrain1 = position.z + size.z + (float)this.MinDistanceFromTerrain;
        float   maxDistanceFromTerrain2 = position.z + size.z + (float)this.MaxDistanceFromTerrain;
        int     num1 = 0;
        List <PlaceMonumentsOffshore.SpawnInfo> spawnInfos = new List <PlaceMonumentsOffshore.SpawnInfo>();
        int num2 = 0;
        List <PlaceMonumentsOffshore.SpawnInfo> spawnInfos1 = new List <PlaceMonumentsOffshore.SpawnInfo>();

        for (int i = 0; i < 10; i++)
        {
            num1 = 0;
            spawnInfos.Clear();
            Prefab <MonumentInfo>[] prefabArray1 = prefabArray;
            for (int j = 0; j < (int)prefabArray1.Length; j++)
            {
                Prefab <MonumentInfo> prefab = prefabArray1[j];
                if (prefab.Parameters)
                {
                    priority = (int)prefab.Parameters.Priority + (int)PrefabPriority.Low;
                }
                else
                {
                    priority = 1;
                }
                int num3 = priority;
                int num4 = num3 * num3 * num3 * num3;
                for (int k = 0; k < 10000; k++)
                {
                    float single2 = 0f;
                    float single3 = 0f;
                    switch (seed % 4)
                    {
                    case 0:
                    {
                        single2 = SeedRandom.Range(ref seed, maxDistanceFromTerrain, minDistanceFromTerrain);
                        single3 = SeedRandom.Range(ref seed, single1, maxDistanceFromTerrain2);
                        break;
                    }

                    case 1:
                    {
                        single2 = SeedRandom.Range(ref seed, single, maxDistanceFromTerrain1);
                        single3 = SeedRandom.Range(ref seed, single1, maxDistanceFromTerrain2);
                        break;
                    }

                    case 2:
                    {
                        single2 = SeedRandom.Range(ref seed, maxDistanceFromTerrain, maxDistanceFromTerrain1);
                        single3 = SeedRandom.Range(ref seed, single1, single1);
                        break;
                    }

                    case 3:
                    {
                        single2 = SeedRandom.Range(ref seed, maxDistanceFromTerrain, maxDistanceFromTerrain1);
                        single3 = SeedRandom.Range(ref seed, minDistanceFromTerrain1, maxDistanceFromTerrain2);
                        break;
                    }
                    }
                    float      single4 = TerrainMeta.NormalizeX(single2);
                    float      height  = heightMap.GetHeight(single4, TerrainMeta.NormalizeZ(single3));
                    Vector3    vector3 = new Vector3(single2, height, single3);
                    Quaternion obj     = prefab.Object.transform.localRotation;
                    Vector3    obj1    = prefab.Object.transform.localScale;
                    if (!this.CheckRadius(spawnInfos, vector3, (float)this.DistanceBetweenMonuments))
                    {
                        prefab.ApplyDecorComponents(ref vector3, ref obj, ref obj1);
                        if ((!prefab.Component || prefab.Component.CheckPlacement(vector3, obj, obj1)) && !prefab.CheckEnvironmentVolumes(vector3, obj, obj1, EnvironmentType.Underground))
                        {
                            PlaceMonumentsOffshore.SpawnInfo spawnInfo = new PlaceMonumentsOffshore.SpawnInfo()
                            {
                                prefab   = prefab,
                                position = vector3,
                                rotation = obj,
                                scale    = obj1
                            };
                            spawnInfos.Add(spawnInfo);
                            num1 += num4;
                            break;
                        }
                    }
                }
            }
            if (num1 > num2)
            {
                num2 = num1;
                GenericsUtil.Swap <List <PlaceMonumentsOffshore.SpawnInfo> >(ref spawnInfos, ref spawnInfos1);
            }
        }
        foreach (PlaceMonumentsOffshore.SpawnInfo spawnInfo1 in spawnInfos1)
        {
            Prefab     prefab1    = spawnInfo1.prefab;
            Vector3    vector31   = spawnInfo1.position;
            Quaternion quaternion = spawnInfo1.rotation;
            Vector3    vector32   = spawnInfo1.scale;
            prefab1.ApplyTerrainPlacements(vector31, quaternion, vector32);
            prefab1.ApplyTerrainModifiers(vector31, quaternion, vector32);
            World.AddPrefab("Monument", prefab1.ID, vector31, quaternion, vector32);
        }
    }
Exemplo n.º 11
0
    public override void Process(uint seed)
    {
        if ((long)World.Size < (long)this.MinSize)
        {
            return;
        }
        TerrainHeightMap heightMap = TerrainMeta.HeightMap;

        Prefab <MonumentInfo>[] array = Prefab.Load <MonumentInfo>("assets/bundled/prefabs/autospawn/" + this.ResourceFolder, (GameManager)null, (PrefabAttribute.Library)null, true);
        if (array == null || array.Length == 0)
        {
            return;
        }
        array.Shuffle <Prefab <MonumentInfo> >(seed);
        array.BubbleSort <Prefab <MonumentInfo> >();
        Vector3 position1 = TerrainMeta.Position;
        Vector3 size      = TerrainMeta.Size;
        float   x1        = (float)position1.x;
        float   z1        = (float)position1.z;
        float   num1      = (float)(position1.x + size.x);
        float   num2      = (float)(position1.z + size.z);
        List <PlaceMonuments.SpawnInfo> a = new List <PlaceMonuments.SpawnInfo>();
        int num3 = 0;
        List <PlaceMonuments.SpawnInfo> b = new List <PlaceMonuments.SpawnInfo>();

        for (int index1 = 0; index1 < 10; ++index1)
        {
            int num4 = 0;
            a.Clear();
            foreach (Prefab <MonumentInfo> prefab in array)
            {
                int num5 = Object.op_Implicit((Object)prefab.Parameters) ? (int)(prefab.Parameters.Priority + 1) : 1;
                int num6 = num5 * num5 * num5 * num5;
                for (int index2 = 0; index2 < 10000; ++index2)
                {
                    float  x2     = SeedRandom.Range(ref seed, x1, num1);
                    float  z2     = SeedRandom.Range(ref seed, z1, num2);
                    float  normX  = TerrainMeta.NormalizeX(x2);
                    float  normZ  = TerrainMeta.NormalizeZ(z2);
                    float  num7   = SeedRandom.Value(ref seed);
                    double factor = (double)this.Filter.GetFactor(normX, normZ);
                    if (factor * factor >= (double)num7)
                    {
                        float   height = heightMap.GetHeight(normX, normZ);
                        Vector3 pos;
                        ((Vector3) ref pos).\u002Ector(x2, height, z2);
                        Quaternion localRotation = prefab.Object.get_transform().get_localRotation();
                        Vector3    localScale    = prefab.Object.get_transform().get_localScale();
                        if (!this.CheckRadius(a, pos, (float)this.Distance))
                        {
                            prefab.ApplyDecorComponents(ref pos, ref localRotation, ref localScale);
                            if ((!Object.op_Implicit((Object)prefab.Component) || prefab.Component.CheckPlacement(pos, localRotation, localScale)) && (prefab.ApplyTerrainAnchors(ref pos, localRotation, localScale, this.Filter) && prefab.ApplyTerrainChecks(pos, localRotation, localScale, this.Filter)) && (prefab.ApplyTerrainFilters(pos, localRotation, localScale, (SpawnFilter)null) && prefab.ApplyWaterChecks(pos, localRotation, localScale) && !prefab.CheckEnvironmentVolumes(pos, localRotation, localScale, EnvironmentType.Underground)))
                            {
                                a.Add(new PlaceMonuments.SpawnInfo()
                                {
                                    prefab   = (Prefab)prefab,
                                    position = pos,
                                    rotation = localRotation,
                                    scale    = localScale
                                });
                                num4 += num6;
                                break;
                            }
                        }
                    }
                }
            }
            if (num4 > num3)
            {
                num3 = num4;
                GenericsUtil.Swap <List <PlaceMonuments.SpawnInfo> >(ref a, ref b);
            }
        }
        foreach (PlaceMonuments.SpawnInfo spawnInfo in b)
        {
            Prefab     prefab    = spawnInfo.prefab;
            Vector3    position2 = spawnInfo.position;
            Quaternion rotation  = spawnInfo.rotation;
            Vector3    scale     = spawnInfo.scale;
            prefab.ApplyTerrainPlacements(position2, rotation, scale);
            prefab.ApplyTerrainModifiers(position2, rotation, scale);
            World.AddPrefab("Monument", prefab.ID, position2, rotation, scale);
        }
    }
Exemplo n.º 12
0
    public override void Process(uint seed)
    {
        if ((long)World.Size < (long)this.MinSize)
        {
            return;
        }
        TerrainHeightMap heightMap = TerrainMeta.HeightMap;

        Prefab <MonumentInfo>[] array = Prefab.Load <MonumentInfo>("assets/bundled/prefabs/autospawn/" + this.ResourceFolder, (GameManager)null, (PrefabAttribute.Library)null, true);
        if (array == null || array.Length == 0)
        {
            return;
        }
        array.Shuffle <Prefab <MonumentInfo> >(seed);
        array.BubbleSort <Prefab <MonumentInfo> >();
        Vector3 position1           = TerrainMeta.Position;
        Vector3 size                = TerrainMeta.Size;
        float   num1                = (float)position1.x - (float)this.MaxDistanceFromTerrain;
        float   num2                = (float)position1.x - (float)this.MinDistanceFromTerrain;
        float   num3                = (float)(position1.x + size.x) + (float)this.MinDistanceFromTerrain;
        float   num4                = (float)(position1.x + size.x) + (float)this.MaxDistanceFromTerrain;
        float   num5                = (float)position1.z - (float)this.MaxDistanceFromTerrain;
        int     distanceFromTerrain = this.MinDistanceFromTerrain;
        float   num6                = (float)(position1.z + size.z) + (float)this.MinDistanceFromTerrain;
        float   num7                = (float)(position1.z + size.z) + (float)this.MaxDistanceFromTerrain;
        List <PlaceMonumentsOffshore.SpawnInfo> a = new List <PlaceMonumentsOffshore.SpawnInfo>();
        int num8 = 0;
        List <PlaceMonumentsOffshore.SpawnInfo> b = new List <PlaceMonumentsOffshore.SpawnInfo>();

        for (int index1 = 0; index1 < 10; ++index1)
        {
            int num9 = 0;
            a.Clear();
            foreach (Prefab <MonumentInfo> prefab in array)
            {
                int num10 = Object.op_Implicit((Object)prefab.Parameters) ? (int)(prefab.Parameters.Priority + 1) : 1;
                int num11 = num10 * num10 * num10 * num10;
                for (int index2 = 0; index2 < 10000; ++index2)
                {
                    float x = 0.0f;
                    float z = 0.0f;
                    switch (seed % 4U)
                    {
                    case 0:
                        x = SeedRandom.Range(ref seed, num1, num2);
                        z = SeedRandom.Range(ref seed, num5, num7);
                        break;

                    case 1:
                        x = SeedRandom.Range(ref seed, num3, num4);
                        z = SeedRandom.Range(ref seed, num5, num7);
                        break;

                    case 2:
                        x = SeedRandom.Range(ref seed, num1, num4);
                        z = SeedRandom.Range(ref seed, num5, num5);
                        break;

                    case 3:
                        x = SeedRandom.Range(ref seed, num1, num4);
                        z = SeedRandom.Range(ref seed, num6, num7);
                        break;
                    }
                    float   normX  = TerrainMeta.NormalizeX(x);
                    float   normZ  = TerrainMeta.NormalizeZ(z);
                    float   height = heightMap.GetHeight(normX, normZ);
                    Vector3 pos;
                    ((Vector3) ref pos).\u002Ector(x, height, z);
                    Quaternion localRotation = prefab.Object.get_transform().get_localRotation();
                    Vector3    localScale    = prefab.Object.get_transform().get_localScale();
                    if (!this.CheckRadius(a, pos, (float)this.DistanceBetweenMonuments))
                    {
                        prefab.ApplyDecorComponents(ref pos, ref localRotation, ref localScale);
                        if ((!Object.op_Implicit((Object)prefab.Component) || prefab.Component.CheckPlacement(pos, localRotation, localScale)) && !prefab.CheckEnvironmentVolumes(pos, localRotation, localScale, EnvironmentType.Underground))
                        {
                            a.Add(new PlaceMonumentsOffshore.SpawnInfo()
                            {
                                prefab   = (Prefab)prefab,
                                position = pos,
                                rotation = localRotation,
                                scale    = localScale
                            });
                            num9 += num11;
                            break;
                        }
                    }
                }
            }
            if (num9 > num8)
            {
                num8 = num9;
                GenericsUtil.Swap <List <PlaceMonumentsOffshore.SpawnInfo> >(ref a, ref b);
            }
        }
        foreach (PlaceMonumentsOffshore.SpawnInfo spawnInfo in b)
        {
            Prefab     prefab    = spawnInfo.prefab;
            Vector3    position2 = spawnInfo.position;
            Quaternion rotation  = spawnInfo.rotation;
            Vector3    scale     = spawnInfo.scale;
            prefab.ApplyTerrainPlacements(position2, rotation, scale);
            prefab.ApplyTerrainModifiers(position2, rotation, scale);
            World.AddPrefab("Monument", prefab.ID, position2, rotation, scale);
        }
    }