/// <summary>
        /// Determines if damage was done by player.
        /// </summary>
        /// <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 (AttackerEntity == null)
                {
                    AISessionCore.DebugWrite("Damage.IsDoneByPlayer", "Attacker entity was not found.", AntiSpam: false);
                    return(false);
                }

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

                AttackerEntity = AttackerEntity.GetTopMostParent();

                if (AttackerEntity == null)
                {
                    AISessionCore.DebugWrite("Damage.IsDoneByPlayer", "Cannot acquire the attacker's topmost entity", AntiSpam: false);
                    return(false);
                }

                if (AttackerEntity is IMyCubeGrid)
                {
                    IMyCubeGrid Grid = AttackerEntity as IMyCubeGrid;
                    if (Grid.IsPirate())
                    {
                        return(false);
                    }
                    if (Grid.IsOwnedByNobody())
                    {
                        return(IsDamagedByPlayerInNeutralGrid(Grid, out Damager));
                    }

                    return(IsDamagedByPlayerGrid(Grid, out Damager));
                }

                return(false);
            }
            catch (Exception Scrap)
            {
                AISessionCore.LogError("Damage.IsDoneByPlayer", new Exception("General crash.", Scrap));
                return(false);
            }
        }
 public static void DeclareWar(this IMyFaction OurFaction, IMyFaction HostileFaction, bool Print = false)
 {
     MyAPIGateway.Session.Factions.DeclareWar(OurFaction.FactionId, HostileFaction.FactionId);
     if (Print)
     {
         AISessionCore.DebugWrite($"{OurFaction.Tag}", $"Declared war on {HostileFaction.Tag}", AntiSpam: false);
     }
 }
 public static void ProposePeace(this IMyFaction OurFaction, IMyFaction HostileFaction, bool Print = false)
 {
     MyAPIGateway.Session.Factions.SendPeaceRequest(OurFaction.FactionId, HostileFaction.FactionId);
     if (Print)
     {
         AISessionCore.DebugWrite($"{OurFaction.Tag}", $"Proposed peace to {HostileFaction.Tag}", AntiSpam: false);
     }
 }
        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)
                    {
                        var 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);
            }
        }
 public static void AcceptPeace(this IMyFaction OurFaction, IMyFaction HostileFaction, bool Print = false)
 {
     MyAPIGateway.Session.Factions.AcceptPeace(HostileFaction.FactionId, OurFaction.FactionId);
     MyAPIGateway.Session.Factions.AcceptPeace(OurFaction.FactionId, HostileFaction.FactionId);
     if (Print)
     {
         AISessionCore.DebugWrite($"{OurFaction.Tag}", $"Accepted peace from {HostileFaction.Tag}", AntiSpam: false);
     }
 }
Exemple #6
0
 virtual public void Shutdown()
 {
     Closed = true;
     if (HasModdedThrusters)
     {
         DemultiplyThrusters();
     }
     AISessionCore.RemoveDamageHandler(Grid);
 }
 static bool IsDamagedByPlayer(IMyEngineerToolBase Tool, out IMyPlayer Damager)
 {
     Damager = null;
     try
     {
         Damager = MyAPIGateway.Players.GetPlayerByID(Tool.OwnerId);
         return(Damager != null ? !Damager.IsBot : false);
     }
     catch (Exception Scrap)
     {
         AISessionCore.LogError("Damage.IsDoneByPlayer", new Exception("Check gun owner crashed", Scrap));
         return(false);
     }
 }
Exemple #8
0
 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 : false);
     }
     catch (Exception Scrap)
     {
         AISessionCore.LogError("Damage.IsDoneByPlayer", new Exception("Check gun owner crashed", Scrap));
         return(false);
     }
 }
Exemple #9
0
        virtual protected void RegisterHostileAction(IMyPlayer Player, TimeSpan TruceDelay)
        {
            try
            {
                #region Sanity checks
                if (Player == null)
                {
                    Grid.DebugWrite("RegisterHostileAction", "Error: Damager is null.");
                    return;
                }
                ;

                if (OwnerFaction == null)
                {
                    OwnerFaction = Grid.GetOwnerFaction();
                }

                if (OwnerFaction == null || !OwnerFaction.IsNPC())
                {
                    Grid.DebugWrite("RegisterHostileAction", $"Error: {(OwnerFaction == null ? "can't find own faction" : "own faction isn't recognized as NPC.")}");
                    return;
                }
                #endregion

                IMyFaction HostileFaction = Player.GetFaction();
                if (HostileFaction == null)
                {
                    Grid.DebugWrite("RegisterHostileAction", "Error: can't find damager's faction");
                    return;
                }
                else if (HostileFaction == OwnerFaction)
                {
                    OwnerFaction.Kick(Player);
                    return;
                }

                AISessionCore.DeclareWar(OwnerFaction, HostileFaction, TruceDelay);
                if (OwnerFaction.IsLawful())
                {
                    AISessionCore.DeclareWar(Diplomacy.Police, HostileFaction, TruceDelay);
                    AISessionCore.DeclareWar(Diplomacy.Army, HostileFaction, TruceDelay);
                }
            }
            catch (Exception Scrap)
            {
                LogError("RegisterHostileAction", Scrap);
            }
        }
Exemple #10
0
 virtual protected void RegisterHostileAction(IMyFaction HostileFaction, TimeSpan TruceDelay)
 {
     try
     {
         if (HostileFaction == null)
         {
             Grid.DebugWrite("RegisterHostileAction", "Error: can't find damager's faction");
             return;
         }
         AISessionCore.DeclareWar(OwnerFaction, HostileFaction, TruceDelay);
         if (OwnerFaction.IsLawful())
         {
             AISessionCore.DeclareWar(Diplomacy.Police, HostileFaction, TruceDelay);
             AISessionCore.DeclareWar(Diplomacy.Army, HostileFaction, TruceDelay);
         }
     }
     catch (Exception Scrap)
     {
         LogError("RegisterHostileAction", Scrap);
     }
 }
 static bool IsDamagedByPlayerGrid(IMyCubeGrid Grid, out IMyPlayer Damager)
 {
     Damager = null;
     try
     {
         long BiggestOwner = Grid.BigOwners.FirstOrDefault();
         if (BiggestOwner != 0)
         {
             Damager = MyAPIGateway.Players.GetPlayerByID(BiggestOwner);
             return(Damager != null ? !Damager.IsBot : false);
         }
         else
         {
             return(false);
         }
     }
     catch (Exception Scrap)
     {
         AISessionCore.LogError("Damage.IsDoneByPlayer", new Exception("Check grid via BigOwners crashed", Scrap));
         return(false);
     }
 }
 public static bool IsNPC(this IMyFaction Faction)
 {
     try
     {
         IMyPlayer Owner = MyAPIGateway.Players.GetPlayerByID(Faction.FounderId);
         if (Owner != null)
         {
             return(Owner.IsBot);
         }
         else
         {
             if (Faction.Members.Count() == 0)
             {
                 return(true);
             }
             foreach (var member in Faction.Members)
             {
                 IMyPlayer Member = MyAPIGateway.Players.GetPlayerByID(member.Value.PlayerId);
                 if (Member == null)
                 {
                     continue;
                 }
                 if (!Member.IsBot)
                 {
                     return(false);
                 }
             }
             return(true);
         }
     }
     catch (Exception Scrap)
     {
         AISessionCore.LogError("Faction.IsNPC", Scrap);
         return(false);
     }
 }
 static bool IsDamagedByPlayerWarhead(IMyWarhead Warhead, out IMyPlayer Damager)
 {
     Damager = null;
     try
     {
         if (Warhead.OwnerId == 0)
         {
             Damager = MyAPIGateway.Players.GetPlayerByID((Warhead as MyCubeBlock).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);
     }
 }
Exemple #14
0
        virtual public bool Init(IMyRemoteControl RC = null)
        {
            this.RC = RC ?? Term.GetBlocksOfType <IMyRemoteControl>(collect: x => x.IsFunctional).FirstOrDefault();
            if (RC == null)
            {
                return(false);
            }
            DroneName = DroneNameProvider;

            Antennae = Term.GetBlocksOfType <IMyRadioAntenna>(collect: x => x.IsFunctional);

            bool HasSetup = ParseSetup();

            if (!HasSetup)
            {
                return(false);
            }

            AISessionCore.AddDamageHandler(Grid, (Block, Damage) => OnDamaged(Block, Damage));
            Grid.OnBlockAdded += (Block) => OnBlockPlaced(Block);
            OwnerFaction       = Grid.GetOwnerFaction(RecalculateOwners: true);
            BotOperable        = true;
            return(true);
        }