public static bool FindRandomTreeInPlaceArea(long entityId, out ItemInfo result) { result = default(ItemInfo); MyPlaceArea area = MyPlaceArea.FromEntity(entityId); if (area == null) { return(false); } var areaBoundingBox = area.WorldAABB; List <MyEntity> entities = null; try { entities = MyEntities.GetEntitiesInAABB(ref areaBoundingBox); m_tmpItemInfoList.Clear(); foreach (var entity in entities) { MyTrees trees = entity as MyTrees; if (trees == null) { continue; } m_tmpEnvItemList.Clear(); trees.GetPhysicalItemsInRadius(areaBoundingBox.Center, (float)areaBoundingBox.HalfExtents.Length(), m_tmpEnvItemList); foreach (var tree in m_tmpEnvItemList) { if (area.TestPoint(tree.Transform.Position)) { var itemInfo = new ItemInfo(); itemInfo.ItemsEntityId = trees.EntityId; itemInfo.ItemId = tree.LocalId; itemInfo.Target = tree.Transform.Position; m_tmpItemInfoList.Add(itemInfo); } } m_tmpEnvItemList.Clear(); } if (m_tmpItemInfoList.Count == 0) { m_tmpItemInfoList.Clear(); return(false); } int treeIndex = (int)Math.Round(MyRandom.Instance.NextFloat() * (m_tmpItemInfoList.Count - 1)); result = m_tmpItemInfoList[treeIndex]; m_tmpItemInfoList.Clear(); return(true); } finally { entities.Clear(); } }
public static bool FindClosestTreeInPlaceArea(Vector3D fromPosition, long entityId, MyHumanoidBot bot, out ItemInfo result) { result = default(ItemInfo); MyPlaceArea area = MyPlaceArea.FromEntity(entityId); if (area == null) { return(false); } var areaBoundingBox = area.WorldAABB; var entities = MyEntities.GetEntitiesInAABB(ref areaBoundingBox, true); double closestDistanceSq = double.MaxValue; foreach (MyEntity entity in entities) { MyTrees trees = entity as MyTrees; if (trees == null) { continue; } m_tmpEnvItemList.Clear(); trees.GetPhysicalItemsInRadius(areaBoundingBox.Center, (float)areaBoundingBox.HalfExtents.Length(), m_tmpEnvItemList); foreach (var tree in m_tmpEnvItemList) { if (!area.TestPoint(tree.Transform.Position)) { continue; } if (!bot.AgentLogic.AiTarget.IsTreeReachable(entity, tree.LocalId)) { continue; } double distanceSq = Vector3D.DistanceSquared(fromPosition, tree.Transform.Position); if (distanceSq < closestDistanceSq) { result.ItemsEntityId = entity.EntityId; result.ItemId = tree.LocalId; result.Target = tree.Transform.Position; closestDistanceSq = distanceSq; } } m_tmpEnvItemList.Clear(); } entities.Clear(); return(closestDistanceSq != double.MaxValue); }
public static bool FindClosestTreeInRadius(Vector3D fromPosition, float radius, out ItemInfo result) { result = default(ItemInfo); BoundingSphereD sphere = new BoundingSphereD(fromPosition, (double)radius); var entities = MyEntities.GetEntitiesInSphere(ref sphere); double closestDistanceSq = double.MaxValue; foreach (MyEntity entity in entities) { MyTrees trees = entity as MyTrees; if (trees == null) { continue; } trees.GetPhysicalItemsInRadius(fromPosition, radius, m_tmpEnvItemList); foreach (var tree in m_tmpEnvItemList) { double distanceSq = Vector3D.DistanceSquared(fromPosition, tree.Transform.Position); if (distanceSq < closestDistanceSq) { result.ItemsEntityId = entity.EntityId; result.ItemId = tree.LocalId; result.Target = tree.Transform.Position; closestDistanceSq = distanceSq; } } } entities.Clear(); return(closestDistanceSq != double.MaxValue); }