Example #1
0
        private static ToolBase.ToolErrors CheckNodeHeights(NetInfo info, FastList <NetTool.NodePosition> nodeBuffer)
        {
            bool flag  = info.m_netAI.BuildUnderground();
            bool flag2 = flag || info.m_netAI.SupportUnderground();

            if (info.m_netAI.LinearMiddleHeight())
            {
                if (nodeBuffer.m_size >= 3)
                {
                    Vector2 b  = VectorUtils.XZ(nodeBuffer.m_buffer[0].m_position);
                    Vector2 b2 = VectorUtils.XZ(nodeBuffer.m_buffer[nodeBuffer.m_size - 1].m_position);
                    float   y  = nodeBuffer.m_buffer[0].m_position.y;
                    float   y2 = nodeBuffer.m_buffer[nodeBuffer.m_size - 1].m_position.y;
                    for (int i = 1; i < nodeBuffer.m_size - 1; i++)
                    {
                        NetTool.NodePosition nodePosition = nodeBuffer.m_buffer[i];
                        float num  = Vector2.Distance(VectorUtils.XZ(nodePosition.m_position), b);
                        float num2 = Vector2.Distance(VectorUtils.XZ(nodePosition.m_position), b2);
                        nodePosition.m_position.y = Mathf.Lerp(y, y2, num / Mathf.Max(1f, num + num2));
                        nodeBuffer.m_buffer[i]    = nodePosition;
                    }
                }

                return(ToolBase.ToolErrors.None);
            }
            else
            {
                bool flag3 = false;
                for (int j = 1; j < nodeBuffer.m_size; j++)
                {
                    NetTool.NodePosition nodePosition2 = nodeBuffer.m_buffer[j - 1];
                    NetTool.NodePosition nodePosition3 = nodeBuffer.m_buffer[j];
                    float num4 = VectorUtils.LengthXZ(nodePosition3.m_position - nodePosition2.m_position);
                    float num5 = num4 * info.m_maxSlope;
                    nodePosition3.m_minY = Mathf.Max(nodePosition3.m_minY, nodePosition2.m_minY - num5);
                    nodePosition3.m_maxY = Mathf.Min(nodePosition3.m_maxY, nodePosition2.m_maxY + num5);
                    if (!flag2)
                    {
                        nodePosition3.m_terrainHeight = Mathf.Min(nodePosition3.m_terrainHeight, nodePosition3.m_position.y + 7.98f);
                        nodePosition3.m_minY          = Mathf.Max(nodePosition3.m_minY, nodePosition3.m_terrainHeight - 7.99f);
                    }
                    nodeBuffer.m_buffer[j] = nodePosition3;
                }
                for (int k = nodeBuffer.m_size - 2; k >= 0; k--)
                {
                    NetTool.NodePosition nodePosition4 = nodeBuffer.m_buffer[k + 1];
                    NetTool.NodePosition nodePosition5 = nodeBuffer.m_buffer[k];
                    float num6 = VectorUtils.LengthXZ(nodePosition5.m_position - nodePosition4.m_position);
                    float num7 = num6 * info.m_maxSlope;
                    nodePosition5.m_minY   = Mathf.Max(nodePosition5.m_minY, nodePosition4.m_minY - num7);
                    nodePosition5.m_maxY   = Mathf.Min(nodePosition5.m_maxY, nodePosition4.m_maxY + num7);
                    nodeBuffer.m_buffer[k] = nodePosition5;
                }
                for (int l = 0; l < nodeBuffer.m_size; l++)
                {
                    NetTool.NodePosition nodePosition6 = nodeBuffer.m_buffer[l];
                    if (nodePosition6.m_minY > nodePosition6.m_maxY)
                    {
                        return(ToolBase.ToolErrors.None); /*SlopeTooSteep;*/
                    }
                    if (nodePosition6.m_position.y > nodePosition6.m_maxY)
                    {
                        nodePosition6.m_position.y = nodePosition6.m_maxY;
                        if (!flag && nodePosition6.m_elevation >= -8f)
                        {
                            nodePosition6.m_minY = nodePosition6.m_maxY;
                        }
                        flag3 = true;
                    }
                    else if (nodePosition6.m_position.y < nodePosition6.m_minY)
                    {
                        nodePosition6.m_position.y = nodePosition6.m_minY;
                        if (flag || nodePosition6.m_elevation < -8f)
                        {
                            nodePosition6.m_maxY = nodePosition6.m_minY;
                        }
                        flag3 = true;
                    }
                    nodeBuffer.m_buffer[l] = nodePosition6;
                }
                if (nodeBuffer.m_size << 1 == 0)
                {
                    return(ToolBase.ToolErrors.None); /*SlopeTooSteep;*/
                }
                if (!flag3)
                {
                    for (int m = 1; m < nodeBuffer.m_size - 1; m++)
                    {
                        NetTool.NodePosition nodePosition7 = nodeBuffer.m_buffer[m - 1];
                        NetTool.NodePosition nodePosition8 = nodeBuffer.m_buffer[m];
                        float num8 = VectorUtils.LengthXZ(nodePosition8.m_position - nodePosition7.m_position);
                        float num9 = num8 * info.m_maxSlope;
                        if (flag || nodePosition8.m_elevation < -8f)
                        {
                            if (nodePosition8.m_position.y > nodePosition7.m_position.y + num9)
                            {
                                nodePosition8.m_position.y = nodePosition7.m_position.y + num9;
                            }
                        }
                        else if (nodePosition8.m_position.y < nodePosition7.m_position.y - num9)
                        {
                            nodePosition8.m_position.y = nodePosition7.m_position.y - num9;
                        }
                        nodeBuffer.m_buffer[m] = nodePosition8;
                    }
                    for (int n = nodeBuffer.m_size - 2; n > 0; n--)
                    {
                        NetTool.NodePosition nodePosition9  = nodeBuffer.m_buffer[n + 1];
                        NetTool.NodePosition nodePosition10 = nodeBuffer.m_buffer[n];
                        float num10 = VectorUtils.LengthXZ(nodePosition10.m_position - nodePosition9.m_position);
                        float num11 = num10 * info.m_maxSlope;
                        if (flag || nodePosition10.m_elevation < -8f)
                        {
                            if (nodePosition10.m_position.y > nodePosition9.m_position.y + num11)
                            {
                                nodePosition10.m_position.y = nodePosition9.m_position.y + num11;
                            }
                        }
                        else if (nodePosition10.m_position.y < nodePosition9.m_position.y - num11)
                        {
                            nodePosition10.m_position.y = nodePosition9.m_position.y - num11;
                        }
                        nodeBuffer.m_buffer[n] = nodePosition10;
                    }
                    int num12;
                    int num13;
                    info.m_netAI.GetElevationLimits(out num12, out num13);
                    if (num13 > num12 && !flag)
                    {
                        int num15;
                        for (int num14 = 0; num14 < nodeBuffer.m_size - 1; num14 = num15)
                        {
                            NetTool.NodePosition nodePosition11 = nodeBuffer.m_buffer[num14];
                            num15 = num14 + 1;
                            float num16 = 0f;
                            bool  flag4 = nodeBuffer.m_buffer[num15].m_position.y >= nodeBuffer.m_buffer[num15].m_terrainHeight + 8f;
                            bool  flag5 = nodeBuffer.m_buffer[num15].m_position.y <= nodeBuffer.m_buffer[num15].m_terrainHeight - 8f;
                            if (!flag2)
                            {
                                flag5 = false;
                            }
                            if (flag4 || flag5)
                            {
                                while (num15 < nodeBuffer.m_size)
                                {
                                    NetTool.NodePosition nodePosition12 = nodeBuffer.m_buffer[num15];
                                    num16 += VectorUtils.LengthXZ(nodePosition12.m_position - nodePosition11.m_position);
                                    if (flag4 && nodePosition12.m_position.y < nodePosition12.m_terrainHeight + 8f)
                                    {
                                        break;
                                    }
                                    if (flag5 && nodePosition12.m_position.y > nodePosition12.m_terrainHeight - 8f)
                                    {
                                        break;
                                    }
                                    nodePosition11 = nodePosition12;
                                    if (num15 == nodeBuffer.m_size - 1)
                                    {
                                        break;
                                    }
                                    num15++;
                                }
                            }
                            float y3 = nodeBuffer.m_buffer[num14].m_position.y;
                            float y4 = nodeBuffer.m_buffer[num15].m_position.y;
                            nodePosition11 = nodeBuffer.m_buffer[num14];
                            float num17 = 0f;
                            num16 = Mathf.Max(1f, num16);
                            for (int num18 = num14 + 1; num18 < num15; num18++)
                            {
                                NetTool.NodePosition nodePosition13 = nodeBuffer.m_buffer[num18];
                                num17 += VectorUtils.LengthXZ(nodePosition13.m_position - nodePosition11.m_position);
                                if (flag5)
                                {
                                    nodePosition13.m_position.y = Mathf.Min(nodePosition13.m_position.y, Mathf.Lerp(y3, y4, num17 / num16));
                                }
                                else
                                {
                                    nodePosition13.m_position.y = Mathf.Max(nodePosition13.m_position.y, Mathf.Lerp(y3, y4, num17 / num16));
                                }
                                nodeBuffer.m_buffer[num18] = nodePosition13;
                                nodePosition11             = nodePosition13;
                            }
                        }
                    }
                }
                ToolBase.ToolErrors toolErrors = ToolBase.ToolErrors.None;
                for (int num19 = 1; num19 < nodeBuffer.m_size - 1; num19++)
                {
                    NetTool.NodePosition nodePosition14 = nodeBuffer.m_buffer[num19 - 1];
                    NetTool.NodePosition nodePosition15 = nodeBuffer.m_buffer[num19 + 1];
                    NetTool.NodePosition nodePosition16 = nodeBuffer.m_buffer[num19];

                    /*if (flag)
                     * {
                     *  if (nodePosition16.m_terrainHeight < nodePosition16.m_position.y)
                     *  {
                     *      toolErrors |= ToolBase.ToolErrors.SlopeTooSteep;
                     *  }
                     * }*
                     * else if (nodePosition16.m_elevation < -8f)
                     * {
                     *  if (nodePosition16.m_terrainHeight <= nodePosition16.m_position.y + 8f)
                     *  {
                     *      toolErrors |= ToolBase.ToolErrors.SlopeTooSteep;
                     *  }
                     * }
                     * else if (!flag2 && nodePosition16.m_terrainHeight > nodePosition16.m_position.y + 8f)
                     * {
                     *  toolErrors |= ToolBase.ToolErrors.SlopeTooSteep;
                     * }*/
                    nodePosition16.m_direction.y = VectorUtils.NormalizeXZ(nodePosition15.m_position - nodePosition14.m_position).y;
                    nodeBuffer.m_buffer[num19]   = nodePosition16;
                }
                return(toolErrors);
            }
        }
Example #2
0
 public static string ToString(NetTool.NodePosition pt)
 {
     return(string.Format("  Position: {0}, Direction: {1}", pt.m_position, pt.m_direction));
 }