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); } }
public static string ToString(NetTool.NodePosition pt) { return(string.Format(" Position: {0}, Direction: {1}", pt.m_position, pt.m_direction)); }