protected MyCharacter FindCharacterInRadius(int radius, bool ignoreReachability = false) { Vector3D translation = this.Bot.Navigation.PositionAndOrientation.Translation; MyCharacter character = null; double num = 3.4028234663852886E+38; foreach (MyPlayer player in Sync.Players.GetOnlinePlayers()) { if (player.Id.SerialId != 0) { MyHumanoidBot bot = MyAIComponent.Static.Bots.TryGetBot <MyHumanoidBot>(player.Id.SerialId); if (bot == null) { continue; } if (bot.BotDefinition.BehaviorType == "Barbarian") { continue; } } if (((player.Character != null) && (ignoreReachability || this.AiTargetBase.IsEntityReachable(player.Character))) && !player.Character.IsDead) { double num2 = Vector3D.DistanceSquared(player.Character.PositionComp.GetPosition(), translation); if ((num2 < (radius * radius)) && (num2 < num)) { character = player.Character; num = num2; } } } return(character); }
public MyHumanoidBotActions(MyHumanoidBot humanoidBot) : base(humanoidBot) { }
public MyHumanoidBotCommonActions(MyHumanoidBot humanoidBot, MyAiTargetBase targetBase) : base(humanoidBot, targetBase) { }
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); }
private static bool FindClosestFracturedTreeInternal(Vector3D fromPosition, Vector3D searchCenter, double searchRadius, MyPlaceArea area, MyHumanoidBot bot, out EntityInfo result) { result = default(EntityInfo); double closestDistanceSq = double.MaxValue; MyFracturedPiece closestTarget = null; Vector3D closestPoint = default(Vector3D); BoundingSphereD searchSphere = new BoundingSphereD(searchCenter, searchRadius); m_tmpFracturePieceList.Clear(); MyFracturedPiecesManager.Static.GetFracturesInSphere(ref searchSphere, ref m_tmpFracturePieceList); for (int i = 0; i < m_tmpFracturePieceList.Count; ++i) { var fracture = m_tmpFracturePieceList[i]; // Skip non-tree fractures if (!MyTrees.IsEntityFracturedTree(fracture)) { continue; } if (IsFracturedTreeStump(fracture)) { continue; } if (!bot.AgentLogic.AiTarget.IsEntityReachable(fracture)) { continue; } Vector3D positionInTrunkLocal = Vector3D.Transform(fromPosition, fracture.PositionComp.WorldMatrixNormalizedInv); Vector3D closestPointOnTrunk; if (!FindClosestPointOnFracturedTree(positionInTrunkLocal, fracture, out closestPointOnTrunk)) { continue; } if (area == null || area.TestPoint(closestPointOnTrunk)) { double distanceSq = Vector3D.DistanceSquared(closestPointOnTrunk, fromPosition); if (distanceSq < closestDistanceSq) { closestDistanceSq = distanceSq; closestTarget = fracture; closestPoint = closestPointOnTrunk; } } } m_tmpFracturePieceList.Clear(); if (closestTarget == null) { return(false); } result.EntityId = closestTarget.EntityId; result.Target = closestPoint; return(true); }
public static bool FindClosestFracturedTreeInArea(Vector3D fromPosition, long areaEntityId, MyHumanoidBot bot, 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, bot, out result));; }
public static bool FindClosestFracturedTreeInRadius(Vector3D fromPosition, double radius, MyHumanoidBot bot, out EntityInfo result) { return(FindClosestFracturedTreeInternal(fromPosition, fromPosition, radius, null, bot, out result)); }