public static bool FindRandomFracturedTreeInPlaceArea(Vector3D fromPosition, long entityId, out EntityInfo result) { result = default(EntityInfo); MyPlaceArea area = MyPlaceArea.FromEntity(entityId); if (area == null) { return(false); } var areaBB = area.WorldAABB; BoundingSphereD searchSphere = new BoundingSphereD(areaBB.Center, (double)areaBB.HalfExtents.Length()); m_tmpFracturePieceList.Clear(); FindFracturedTreesInternal(fromPosition, area, searchSphere); if (m_tmpFracturePieceList.Count == 0) { m_tmpFracturePieceList.Clear(); return(false); } int fractureIndex = (int)Math.Round(MyRandom.Instance.NextFloat() * (m_tmpFracturePieceList.Count - 1)); MyFracturedPiece selectedTarget = m_tmpFracturePieceList[fractureIndex]; m_tmpFracturePieceList.Clear(); result.EntityId = selectedTarget.EntityId; result.Target = selectedTarget.PositionComp.GetPosition(); return(true); }
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 FindClosestFracturedTreeInArea(Vector3D fromPosition, long areaEntityId, out EntityInfo result) { result = default(EntityInfo); MyPlaceArea area = MyPlaceArea.FromEntity(areaEntityId); if (area == null) { return(false); } BoundingBoxD areaBB = area.WorldAABB; double radius = (double)areaBB.HalfExtents.Length(); return(FindClosestFracturedTreeInternal(fromPosition, areaBB.Center, radius, area, out result));; }
public static bool FindRandomCollectableItemInPlaceArea(long entityId, HashSet <MyDefinitionId> itemDefinitions, out ComponentInfo result) { result = default(ComponentInfo); result.IsBlock = true; MyPlaceArea area = MyPlaceArea.FromEntity(entityId); if (area == null) { return(false); } var areaBoundingBox = area.WorldAABB; List <MyEntity> entities = null; try { entities = MyEntities.GetEntitiesInAABB(ref areaBoundingBox); for (int i = entities.Count - 1; i >= 0; i--) { var entity = entities[i]; if (MyManipulationTool.IsEntityManipulated(entity)) { entities.RemoveAtFast(i); continue; } var cubeGrid = entity as MyCubeGrid; var fo = entity as MyFloatingObject; if (fo == null && (cubeGrid == null || cubeGrid.BlocksCount != 1)) { entities.RemoveAtFast(i); continue; } if (cubeGrid != null) { MySlimBlock first = cubeGrid.CubeBlocks.First(); if (!itemDefinitions.Contains(first.BlockDefinition.Id)) { entities.RemoveAtFast(i); continue; } } else if (fo != null) { var id = fo.Item.Content.GetId(); if (!itemDefinitions.Contains(id)) { entities.RemoveAtFast(i); continue; } } } if (entities.Count() == 0) { return(false); } int randIdx = (int)Math.Round(MyRandom.Instance.NextFloat() * (entities.Count() - 1)); var selectedEntity = entities[randIdx]; result.EntityId = selectedEntity.EntityId; if (selectedEntity is MyCubeGrid) { var selectedCube = selectedEntity as MyCubeGrid; var first = selectedCube.GetBlocks().First(); result.EntityId = selectedCube.EntityId; result.BlockPosition = first.Position; result.ComponentDefinitionId = GetComponentId(first); result.IsBlock = true; } else { result.IsBlock = false; } return(true); } finally { entities.Clear(); } }