public UniqueTreeInstance(uint treeID, UniqueTree uniqueTree) { UniqueName = uniqueTree.UniqueName; TreeID = treeID; OriginalName = uniqueTree.OriginalName; Flags = TreeInstance.Flags.Created; }
public static bool HasTreeFlags(TreeInstance.Flags somevalue, TreeInstance.Flags flagtocheck) { return((somevalue & flagtocheck) == flagtocheck); }
private static bool RayCast(TreeManager tm, Segment3 ray, ItemClass.Service service, ItemClass.SubService subService, ItemClass.Layer itemLayers, TreeInstance.Flags ignoreFlags, out Vector3 hit, out uint treeIndex) { unsafe { int num; int num1; int num2; int num3; int num4; int num5; float single; float single1; Bounds bound = new Bounds(new Vector3(0f, 512f, 0f), new Vector3(17280f, 1152f, 17280f)); if (ray.Clip(bound)) { Vector3 vector3 = ray.b - ray.a; int num6 = (int)((double)ray.a.x / 32 + 270); int num7 = (int)((double)ray.a.z / 32 + 270); int num8 = (int)((double)ray.b.x / 32 + 270); int num9 = (int)((double)ray.b.z / 32 + 270); float single2 = Mathf.Abs(vector3.x); float single3 = Mathf.Abs(vector3.z); if ((double)single2 < (double)single3) { num = 0; num1 = ((double)vector3.z <= 0 ? -1 : 1); if ((double)single3 != 0) { vector3 = vector3 * (32f / single3); } } else { num = ((double)vector3.x <= 0 ? -1 : 1); num1 = 0; if ((double)single2 != 0) { vector3 = vector3 * (32f / single2); } } float single4 = 2f; float single5 = 10000f; treeIndex = 0; Vector3 vector31 = ray.a; Vector3 vector32 = ray.a; int num10 = num6; int num11 = num7; do { Vector3 vector33 = vector32 + vector3; if (num == 0) { num4 = ((num11 != num7 || num1 <= 0) && (num11 != num9 || num1 >= 0) ? Mathf.Max(num11, 0) : Mathf.Max((int)(((double)vector33.z - 72) / 32 + 270), 0)); num5 = ((num11 != num7 || num1 >= 0) && (num11 != num9 || num1 <= 0) ? Mathf.Min(num11, 539) : Mathf.Min((int)(((double)vector33.z + 72) / 32 + 270), 539)); num2 = Mathf.Max((int)(((double)Mathf.Min(vector31.x, vector33.x) - 72) / 32 + 270), 0); num3 = Mathf.Min((int)(((double)Mathf.Max(vector31.x, vector33.x) + 72) / 32 + 270), 539); } else { num2 = ((num10 != num6 || num <= 0) && (num10 != num8 || num >= 0) ? Mathf.Max(num10, 0) : Mathf.Max((int)(((double)vector33.x - 72) / 32 + 270), 0)); num3 = ((num10 != num6 || num >= 0) && (num10 != num8 || num <= 0) ? Mathf.Min(num10, 539) : Mathf.Min((int)(((double)vector33.x + 72) / 32 + 270), 539)); num4 = Mathf.Max((int)(((double)Mathf.Min(vector31.z, vector33.z) - 72) / 32 + 270), 0); num5 = Mathf.Min((int)(((double)Mathf.Max(vector31.z, vector33.z) + 72) / 32 + 270), 539); } for (int i = num4; i <= num5; i++) { for (int j = num2; j <= num3; j++) { uint mTreeGrid = tm.m_treeGrid[i * 540 + j]; int num12 = 0; while (mTreeGrid != 0) { if ((tm.m_trees.m_buffer[mTreeGrid].m_flags & (ushort)ignoreFlags) == (ushort)TreeInstance.Flags.None && (double)ray.DistanceSqr(tm.m_trees.m_buffer[mTreeGrid].Position) < 2500) { TreeInfo info = tm.m_trees.m_buffer[mTreeGrid].Info; if ((service == ItemClass.Service.None || info.m_class.m_service == service) && (subService == ItemClass.SubService.None || info.m_class.m_subService == subService) && (itemLayers == ItemClass.Layer.None || (info.m_class.m_layer & itemLayers) != ItemClass.Layer.None) && tm.m_trees.m_buffer[mTreeGrid].RayCast(mTreeGrid, ray, out single, out single1) && ((double)single < (double)single4 - 9.99999974737875E-05 || (double)single < (double)single4 + 9.99999974737875E-05 && (double)single1 < (double)single5)) { single4 = single; single5 = single1; treeIndex = mTreeGrid; } } mTreeGrid = tm.m_trees.m_buffer[mTreeGrid].m_nextGridTree; int num13 = num12 + 1; num12 = num13; if (num13 <= LimitTreeManager.Helper.TreeLimit) { continue; } CODebugBase<LogChannel>.Error(LogChannel.Core, string.Concat("Invalid list detected!\n", Environment.StackTrace)); break; } } } vector31 = vector32; vector32 = vector33; num10 = num10 + num; num11 = num11 + num1; } while ((num10 <= num8 || num <= 0) && (num10 >= num8 || num >= 0) && (num11 <= num9 || num1 <= 0) && (num11 >= num9 || num1 >= 0)); if ((double)single4 != 2) { hit = ray.Position(single4); return true; } } hit = Vector3.zero; treeIndex = 0; return false; } }