Пример #1
0
 public override bool IsInvalid(MySmallShipBot bot)
 {
     return(m_invalidated || m_entityRemoved || Target == null || Target.IsDead() || bot.IsSpoiledHologram(Target) || !Target.Activated);
 }
Пример #2
0
        public void DoWork()
        {
            //  Search for target to attack
            ClosestEnemy  = null;
            ClosestVisual = null;

            float distanceSqr              = m_seeDistance * m_seeDistance;
            float closestEnemyDistanceSqr  = float.PositiveInfinity;
            float closestVisualDistanceSqr = float.PositiveInfinity;

            using (var rbFounded = PoolList <MyRBElement> .Get())
            {
                try
                {
                    MyEntities.EntityCloseLock.AcquireShared();

                    MyDynamicAABBTree prunningStructure = MyPhysics.physicsSystem.GetRigidBodyModule().GetPruningStructure();

                    BoundingBox rbInputElementGetWorldSpaceAABB = new BoundingBox(
                        m_botWorldMatrix.Translation - new Vector3(m_seeDistance),
                        m_botWorldMatrix.Translation + new Vector3(m_seeDistance));
                    prunningStructure.OverlapAllBoundingBox(ref rbInputElementGetWorldSpaceAABB, rbFounded, (uint)MyElementFlag.EF_RB_ELEMENT);

                    //now try find spot
                    foreach (MyRBElement rb in rbFounded)
                    {
                        if (m_bot == null)
                        {
                            return;
                        }

                        var rigidBody = rb.GetRigidBody();
                        if (rigidBody == null)
                        {
                            continue;
                        }

                        MyEntity entity = ((MyPhysicsBody)rigidBody.m_UserData).Entity;
                        if (entity == m_bot || entity == null || entity.AIPriority == -1)
                        {
                            continue;
                        }


                        entity = entity.GetBaseEntity();    // Large weapons

                        // Ignore spoiled holograms
                        if (m_bot.IsSpoiledHologram(entity))
                        {
                            continue;
                        }

                        // Don't attack disabled weapons
                        MyPrefabLargeWeapon largeWeapon = entity as MyPrefabLargeWeapon;
                        MySmallShip         smallShip   = entity as MySmallShip;
                        MyPrefabLargeShip   largeShip   = entity as MyPrefabLargeShip;

                        if (largeWeapon != null && !largeWeapon.IsWorking())
                        {
                            continue;
                        }

                        // Test smallships and largeweapons
                        if (smallShip != null || largeWeapon != null || largeShip != null)
                        {
                            // Is enemy?
                            if (MyFactions.GetFactionsRelation(m_bot, entity) == MyFactionRelationEnum.Enemy && CanSeeTarget(m_bot, entity))
                            {
                                var entityDistanceSqr = Vector3.DistanceSquared(entity.GetPosition(), m_position);

                                if (entityDistanceSqr < distanceSqr &&
                                    (ClosestEnemy == null || entity.AIPriority >= ClosestEnemy.AIPriority) &&
                                    (entityDistanceSqr < closestEnemyDistanceSqr || entity.AIPriority > ClosestEnemy.AIPriority))
                                {
                                    MyLine line   = new MyLine(m_position, entity.GetPosition(), true);
                                    var    result = MyEntities.GetIntersectionWithLine(ref line, m_bot, entity, true, ignoreChilds: true);
                                    if (!result.HasValue)
                                    {
                                        // Visual Detection - ignore visualy detected targets if they are further than any normaly detected target
                                        if (IsVisualyDetected(smallShip))
                                        {
                                            if (entityDistanceSqr < closestVisualDistanceSqr)
                                            {
                                                ClosestVisual            = entity;
                                                closestVisualDistanceSqr = entityDistanceSqr;
                                            }
                                        }
                                        else
                                        {
                                            closestEnemyDistanceSqr = entityDistanceSqr;
                                            ClosestEnemy            = entity;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                finally
                {
                    MyEntities.EntityCloseLock.ReleaseShared();
                }
            }
        }
Пример #3
0
 public override bool IsInvalid(MySmallShipBot bot)
 {
     return(base.IsInvalid(bot) || Entity == null || bot.IsLeaderLost() || bot.IsSpoiledHologram(Entity));
 }
 public override bool IsInvalid(MySmallShipBot bot)
 {
     return(invalid || DamageSource.IsDead() || bot.IsLeaderLost() || bot.IsSpoiledHologram(DamageSource) || MyFactions.GetFactionsRelation(bot, DamageSource) != MyFactionRelationEnum.Enemy || !DamageSource.Activated);
 }
Пример #5
0
 public override bool IsInvalid(MySmallShipBot bot)
 {
     return(base.IsInvalid(bot) || invalid || Enemy.IsDead() || bot.IsLeaderLost() || bot.IsSpoiledHologram(Enemy) || MyFactions.GetFactionsRelation(bot, Enemy) != MyFactionRelationEnum.Enemy || !Enemy.Activated || Enemy.AIPriority == -1);
 }
 public override bool IsInvalid(MySmallShipBot bot)
 {
     return invalid || DamageSource.IsDead() || bot.IsLeaderLost() || bot.IsSpoiledHologram(DamageSource) || MyFactions.GetFactionsRelation(bot, DamageSource) != MyFactionRelationEnum.Enemy || !DamageSource.Activated;
 }
Пример #7
0
 public override bool IsInvalid(MySmallShipBot bot)
 {
     return m_invalidated || m_entityRemoved || Target == null || Target.IsDead() || bot.IsSpoiledHologram(Target) || !Target.Activated;
 }
Пример #8
0
 public override bool IsInvalid(MySmallShipBot bot)
 {
     return base.IsInvalid(bot) || Entity == null || bot.IsLeaderLost() || bot.IsSpoiledHologram(Entity);
 }