public static bool IsNpc(this IMyFaction faction)
 {
     try
     {
         IMyPlayer owner = MyAPIGateway.Players.GetPlayerById(faction.FounderId);
         if (owner != null)
         {
             return(owner.IsBot);
         }
         if (!faction.Members.Any())
         {
             return(true);
         }
         foreach (KeyValuePair <long, MyFactionMember> myMember in faction.Members)
         {
             IMyPlayer member = MyAPIGateway.Players.GetPlayerById(myMember.Value.PlayerId);
             if (member == null)
             {
                 continue;
             }
             if (!member.IsBot)
             {
                 return(false);
             }
         }
         return(true);
     }
     catch (Exception scrap)
     {
         AiSessionCore.LogError("Faction.IsNPC", scrap);
         return(false);
     }
 }
Exemplo n.º 2
0
        private static bool IsDamagedByPlayerInNeutralGrid(IMyCubeGrid grid, out IMyPlayer damager)
        {
            damager = null;
            try
            {
                damager = grid.FindControllingPlayer();
                if (damager != null)
                {
                    return(!damager.IsBot);
                }

                try
                {
                    List <MyCubeBlock> cubeBlocks = grid.GetBlocks <MyCubeBlock>(x => x.BuiltBy != 0);
                    if (cubeBlocks.Count != 0)
                    {
                        long thatCunningGrieferId = cubeBlocks[0].BuiltBy;
                        damager = MyAPIGateway.Players.GetPlayerById(thatCunningGrieferId);
                        return(damager != null);
                    }
                    else
                    {
                        List <IMySlimBlock> slimBlocks = grid.GetBlocks(Selector: x => x.GetBuiltBy() != 0, BlockLimit: 50);
                        if (slimBlocks.Count == 0)
                        {
                            return(false);                                               // We give up on this one
                        }
                        else
                        {
                            try
                            {
                                damager = MyAPIGateway.Players.GetPlayerById(slimBlocks.First().GetBuiltBy());
                                if (damager != null)
                                {
                                    grid.DebugWrite("Damage.IsDoneByPlayer.FindBuilderBySlimBlocks", $"Found damager player from slim block. Damager is {damager.DisplayName}");
                                }
                                return(damager != null);
                            }
                            catch (Exception scrap)
                            {
                                AiSessionCore.LogError("Damage.IsDoneByPlayer", new Exception("Check grid via SlimBlocks BuiltBy crashed.", scrap));
                                return(false);
                            }
                        }
                    }
                }
                catch (Exception scrap)
                {
                    AiSessionCore.LogError("Damage.IsDoneByPlayer", new Exception("Check grid via BuiltBy crashed.", scrap));
                    return(false);
                }
            }
            catch (Exception scrap)
            {
                AiSessionCore.LogError("Damage.IsDoneByPlayer", new Exception("Check neutral grid crashed", scrap));
                return(false);
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Determines if damage was done by player.
        /// </summary>
        /// <param name="damage"></param>
        /// <param name="damager">Provides player who did the damage. Null if damager object is not a player.</param>
        public static bool IsDoneByPlayer(this MyDamageInformation damage, out IMyPlayer damager)
        {
            damager = null;

            try
            {
                IMyEntity attackerEntity = MyAPIGateway.Entities.GetEntityById(damage.AttackerId);
                if (damage.IsDeformation || damage.AttackerId == 0 || attackerEntity == null)
                {
                    return(false);
                }

                if (attackerEntity is IMyMeteor)
                {
                    return(false);
                }
                if (attackerEntity is IMyWarhead)
                {
                    return(IsDamagedByPlayerWarhead(attackerEntity as IMyWarhead, out damager));
                }
                if (attackerEntity is IMyEngineerToolBase)
                {
                    return(IsDamagedByPlayer(attackerEntity as IMyEngineerToolBase, out damager));
                }
                if (attackerEntity is IMyGunBaseUser)
                {
                    return(IsDamagedByPlayer(attackerEntity as IMyGunBaseUser, out damager));
                }

                attackerEntity = attackerEntity.GetTopMostParent();

                if (attackerEntity == null)
                {
                    AiSessionCore.DebugLog?.WriteToLog("IsDoneByPlayer", $"attackerEntity was NULL");
                    AiSessionCore.DebugWrite("Damage.IsDoneByPlayer", "Cannot acquire the attacker's topmost entity", antiSpam: false);
                    return(false);
                }

                if (!(attackerEntity is IMyCubeGrid))
                {
                    return(false);
                }
                IMyCubeGrid grid = attackerEntity as IMyCubeGrid;
                if (grid.IsPirate())
                {
                    return(false);
                }
                //grid.GetOwnerFaction()
                return(grid.IsOwnedByNobody() ? IsDamagedByPlayerInNeutralGrid(grid, out damager) : IsDamagedByPlayerGrid(grid, out damager));
            }
            catch (Exception scrap)
            {
                AiSessionCore.LogError("Damage.IsDoneByPlayer", new Exception("General crash.", scrap));
                return(false);
            }
        }
Exemplo n.º 4
0
 private static bool IsDamagedByPlayer(IMyEngineerToolBase tool, out IMyPlayer damager)
 {
     damager = null;
     try
     {
         damager = MyAPIGateway.Players.GetPlayerById(tool.OwnerIdentityId);
         //AISessionCore.DebugWrite($"ToolDamage.IsDamagedByPlayer", $"Getting player from tool. ID: {Tool.OwnerId}, IdentityID: {Tool.OwnerIdentityId}, player: {(Damager != null ? Damager.DisplayName : "null")}", false);
         return(damager != null && !damager.IsBot);
     }
     catch (Exception scrap)
     {
         AiSessionCore.LogError("Damage.IsDoneByPlayer", new Exception("Check gun owner crashed", scrap));
         return(false);
     }
 }
Exemplo n.º 5
0
 private static bool IsDamagedByPlayer(IMyGunBaseUser gun, out IMyPlayer damager)
 {
     damager = null;
     try
     {
         damager = MyAPIGateway.Players.GetPlayerById(gun.OwnerId);
         //AISessionCore.DebugWrite($"GunDamage.IsDamagedByPlayer", $"Getting player from gun. ID: {Gun.OwnerId}, player: {(Damager != null ? Damager.DisplayName : "null")}", false);
         return(!damager?.IsBot ?? false);
     }
     catch (Exception scrap)
     {
         AiSessionCore.LogError("Damage.IsDoneByPlayer", new Exception("Check gun owner crashed", scrap));
         return(false);
     }
 }
Exemplo n.º 6
0
 private static bool IsDamagedByPlayerGrid(IMyCubeGrid grid, out IMyPlayer damager)
 {
     damager = null;
     try
     {
         long biggestOwner = grid.BigOwners.FirstOrDefault();
         if (biggestOwner == 0)
         {
             return(false);
         }
         damager = MyAPIGateway.Players.GetPlayerById(biggestOwner);
         return(!damager?.IsBot ?? false);
     }
     catch (Exception scrap)
     {
         AiSessionCore.LogError("Damage.IsDoneByPlayer", new Exception("Check grid via BigOwners crashed", scrap));
         return(false);
     }
 }
Exemplo n.º 7
0
        /// <summary>
        /// Determines if damage was done by player.
        /// <para/>
        /// If it's necessary to determine who did the damage, use overload.
        /// </summary>
        //public static bool IsDoneByPlayer(this MyDamageInformation damage)
        //{
        //	IMyPlayer trash;
        //	return damage.IsDoneByPlayer(out trash);
        //}

        private static bool IsDamagedByPlayerWarhead(IMyWarhead warhead, out IMyPlayer damager)
        {
            damager = null;
            try
            {
                if (warhead.OwnerId == 0)
                {
                    damager = MyAPIGateway.Players.GetPlayerById(((MyCubeBlock)warhead).BuiltBy);
                    AiSessionCore.DebugWrite("Damage.IsDoneByPlayer", "Attempting to find damager by neutral warhead.");
                    return(damager != null);
                }
                else
                {
                    damager = MyAPIGateway.Players.GetPlayerById(warhead.OwnerId);
                    AiSessionCore.DebugWrite("Damage.IsDoneByPlayer", "Attempting to find damager by warhead owner.");
                    return(damager != null);
                }
            }
            catch (Exception scrap)
            {
                AiSessionCore.LogError("Damage.IsDoneByPlayer", new Exception("Check for neutral warheads crashed", scrap));
                return(false);
            }
        }